Description

吉林一中是一所远近闻名的学校。每年都会有一些学生被保送到全国各个大学就读。最近,2006年的保送工作即将展开。 今年有N个人具有保送的资格(至少要在某些科目上获奖),并且有M个学校想要在吉林一中招收保送生。由于人数限制,每个学校都有他们的招收上限,而且在每个学生的心里也有他们理想的大学。 每个学校都有他们喜欢的科目,所以他们只招收在符合他们要求的科目上获奖的学生。 我们想要知道,最多可以有多少的学生可以同时保送。

Input

输入包含多组测试数据。每组数据的第一行包含两个整数N, M, (1<= N <= 300, 1<= M <= 300), N表示学生总数,M表示大学总数。学生被编号为1到N,学校被编号为1到M。 接下来N行,每行描述一个学生,首先有两个整数d p, d 是该学生获奖总数,p是学生理想的大学的数目,然后d个单词,表示该学生获奖科目。然后p个数字表示该学生理想的大学编号。 接下来M行,每行描述一个学校,首先有两个整数l f,l是该学校招收的最多人数,接下来f个单词表示该学校招收的获奖科目。 输入文件结束于 N = M = 0。

Output

对于每组数据,输出包含一个整数即为最多可以同时保送的人数。

Sample Input

3 3
1 1 math 1
1 1 math 2
1 1 physics 3
2 1 math
2 1 math
2 2 math physics
0 0

Sample Output

3
裸的网络最大流,关键在于把图给建出来。
#include<cstdio>
#include<cmath>
#include<map>
#include<string>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
int n,m,x,y,z;
char ss[maxn];
vector<string> s[maxn];
vector<int> t[maxn];
map<string,bool> M[maxn];
int v[maxn];struct MaxFlow
{const static int maxe = 2e5 + 10;    //边数const static int maxp = 1e3 + 10;   //点数const static int INF = 0x7FFFFFFF;struct Edges{int x, f;Edges(){}Edges(int x, int f) :x(x), f(f){}}edge[maxe];int first[maxp], next[maxe], dis[maxp], tot, work[maxp], n;void clear(int x){ n = x; tot = 0; for (int i = 0; i <= n; i++) first[i] = -1; }void AddEdge(int s, int t, int f){edge[tot] = Edges(t, 0); next[tot] = first[s]; first[s] = tot++;edge[tot] = Edges(s, f); next[tot] = first[t]; first[t] = tot++;}bool bfs(int s, int t){for (int i = 0; i <= n; i++) dis[i] = -1;queue<int> p;    p.push(s);    dis[s] = 0;while (!p.empty()){int q = p.front();    p.pop();for (int i = first[q]; i != -1; i = next[i]){if (edge[i ^ 1].f&&dis[edge[i].x] == -1){p.push(edge[i].x);dis[edge[i].x] = dis[q] + 1;if (dis[t] != -1) return true;}}}return false;}int dfs(int s, int t, int low){if (s == t) return low;for (int &i = work[s], x; i >= 0; i = next[i]){if (dis[s] + 1 == dis[edge[i].x] && edge[i ^ 1].f && (x = dfs(edge[i].x, t, min(low, edge[i ^ 1].f)))){edge[i].f += x;    edge[i ^ 1].f -= x;  return x;}}return 0;}int dinic(int s, int t){int maxflow = 0, inc = 0;while (bfs(s, t)){for (int i = 0; i <= n; i++) work[i] = first[i];while (inc = dfs(s, t, INF)) maxflow += inc;}return maxflow;}
}solve;int main()
{while (~scanf("%d%d",&n,&m),n+m) {for (int i=1;i<=n;i++){scanf("%d%d",&x,&y);t[i].clear(); s[i].clear();while (x--) scanf("%s",ss),s[i].push_back(ss);while (y--) scanf("%d",&z),t[i].push_back(z);}solve.clear(n+m+1);for (int i=1;i<=m;i++){scanf("%d%d",&v[i],&x);   M[i].clear();while (x--) scanf("%s",ss),M[i][ss]=true;solve.AddEdge(i+n,m+n+1,v[i]);}for (int i=1;i<=n;i++){solve.AddEdge(0,i,1);for (int j=0;j<t[i].size();j++){for (int k=0;k<s[i].size();k++){if (M[t[i][j]][s[i][k]]){solve.AddEdge(i,t[i][j]+n,1);break;}}}}printf("%d\n",solve.dinic(0,n+m+1));}return 0;
}

FZU 1397 保送相关推荐

  1. fzu 2150 Fire Game 【身手BFS】

    称号:fzu 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧全部 ...

  2. 「乾坤」学霸同保送!双胞胎帅哥一起上北大,哥哥本科发表2篇SCI

    视学算法报道   编辑:桃子 [新智元导读]有一种「默契」叫一起上北大.近日,一对双胞胎兄弟双双圆梦北大,哥哥李世乾被保送至北大信息科学技术学院直博,弟弟李世坤被保送至北大工学院.2022年,「乾坤」 ...

  3. 他保送北大、读完博士选择回中学任教,“做科研太枯燥,自己更适合教书”...

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 清北人才 ...

  4. 姚班学霸陈立杰:16岁保送清华,18岁拿下IOI世界冠军,现摘得FOCS 2019最佳学生论文...

    郭一璞 安妮 发自 凹非寺 量子位 出品  | 公众号 QbitAI 今年的理论计算机顶会FOCS,一位来自浙江湖州的小哥哥一口气中了3篇论文,还拿下了最佳学生论文奖. 而且这不是偶然神迹,类似操作, ...

  5. FZU 1686 神龙的难题(DLX反复覆盖)

    FZU 1686 神龙的难题 题目链接 题意:中文题 思路:每个1看成列,每个位置作为左上角的矩阵看成行.dlx反复覆盖就可以 代码: #include <cstdio> #include ...

  6. 免高考!2021清华北大保送名单公布,五大学科竞赛260人获保送资格

    转载自:新智元 日前,清华.北大公布了2021年保送生拟录取名单,共371人.其中,北大193人,清华178人. 而在去年,共有367名学生保送清华北大. 由于清华大学.北京大学代表着我国高校中最顶尖 ...

  7. 中国队蝉联国际奥数冠军,6名选手获5金1银,3人保送北大、3人保送清华

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 第61届国际数学奥林匹克竞赛(IMO)已公布赛果. 在本届IMO竞赛上,中国队以5金1银的成绩 ...

  8. FZU 1649 Prime number or not (Miller-Rabin素数测试)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1649 题目大意:很直接,判断一个数n(2<=n<=10^18)是不是素数.   当n达到long ...

  9. FZU 2159 WuYou

    FZU 2159 题意:给你两个串,A串和B串,其中A串有些不确定.叫你求 A < B的最大A串 做法:一开始做错了.去问小坤子,他讲了一下他的思路.就是开一个 f 数组.f[i]表示从第i位开 ...

最新文章

  1. Python3 网络编程(转载)
  2. 快速入门分库分表概念原理
  3. 如何利用CycleGAN实现男女性别转换
  4. 【PAT乙级】1040 有几个PAT (25 分)
  5. 内部矩阵维度必须一致simulink_深度学习/目标检测之numpy——向量和矩阵乘法相关...
  6. Vue.js中data,props和computed数据
  7. 如何在excel 单元格中增加换行
  8. jquery 访问.ashx ashx取所传参数的值
  9. python qt信号在qml 的使用_Python和C++混合使用QML开发GUI
  10. 关于“指针数组”和”数组指针“
  11. 中国水密门市场趋势报告、技术动态创新及市场预测
  12. 基于Java的汽车租赁系统
  13. 高中计算机课程事例,【高中信息技术教学案例】_《高中信息技术新课程教学案例集》介绍...
  14. ubuntu下配置安装PyQt4
  15. 计算机网络基础简答题
  16. cocos2d-x : csb的加载
  17. 简单粗暴讲述自动化仓储系统
  18. 查看变量内存的python内置函数是_这68个Python内置函数,建议你吃透
  19. 数据交换技术:OPC技术工作原理简述
  20. oracle 索引快速全扫描,使用目录快速全扫描(Index FFS)避免全表扫描的若干场景

热门文章

  1. MySQL分区表的介绍及使用
  2. 题目: 编写一个程序,实现设置上月、本月电表读数,显示上月、本月电表读数,计算并显示本月用电数。假设每度电的价格为1.2元,计算并显示本月电费。
  3. 雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
  4. 辉煌优配|汽车产业链股走高,嵘泰股份涨停,多利科技等大涨
  5. 分布式信息处理利用计算机的,分布式的信息处理需要利用计算机的什么
  6. 博思得RFID技术引领物联网智能打印
  7. 一起撸个朋友圈吧(step2) 数据结构(JSON结构)【下】篇
  8. 【c语言趣味编程100例】打鱼还是晒网
  9. from aip import AipFace 报错 No module named aip
  10. Ip网络技术组建--hybrid混合接口的简单配置例子