hdu - 1083 - Courses
题意:有P门课程,N个学生,每门课程有一些学生选读,每个学生选读一些课程,问能否选出P个学生组成一个委员会,使得每个学生代言一门课程(他必需选读其代言的课程),每门课程都被一个学生代言(1 <= P <= 100,1 <= N <= 300) 。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083
——>>第一次自己想出的网络流。。。虽然是水题,但也开心死死。。。
建图:设超级源S,S到每门课程连一条边,容量为1;每门课程向其选读的学生各连一条边,容量为1;每个学生向超级汇连一条边,容量为1。
这样,只要求一次最大流,判断其是否为满流P就好。。。
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring> using namespace std; const int maxn = 400 + 10;
const int maxm = 60800 + 10;
const int INF = 0x3f3f3f3f; int head[maxn], nxt[maxm], ecnt, v[maxm], flow[maxm], cap[maxm];
bool flag[maxn]; struct Dinic{
int m, s, t;
int d[maxn], cur[maxn];
bool vis[maxn]; Dinic(){
memset(head, -1, sizeof(head));
ecnt = 0;
} void addEdge(int uu, int vv, int ca){
v[ecnt] = vv; cap[ecnt] = ca; flow[ecnt] = 0; nxt[ecnt] = head[uu]; head[uu] = ecnt; ecnt++;
v[ecnt] = uu; cap[ecnt] = 0; flow[ecnt] = 0; nxt[ecnt] = head[vv]; head[vv] = ecnt; ecnt++;
} bool bfs(){
d[s] = 0;
memset(vis, 0, sizeof(vis));
queue<int> qu;
qu.push(s);
vis[s] = 1;
while(!qu.empty()){
int u = qu.front(); qu.pop();
for(int e = head[u]; e != -1; e = nxt[e]){
if(!vis[v[e]] && cap[e] > flow[e]){
d[v[e]] = d[u] + 1;
vis[v[e]] = 1;
qu.push(v[e]);
}
}
}
return vis[t];
} int dfs(int u, int a){
if(u == t || a == 0) return a;
int f, Flow = 0;
for(int e = cur[u]; e != -1; e = nxt[e]){
cur[u] = e;
if(d[v[e]] == d[u] + 1 && (f = dfs(v[e], min(a, cap[e]-flow[e]))) > 0){
flow[e] += f;
flow[e^1] -= f;
Flow += f;
a -= f;
if(!a) break;
}
}
return Flow;
} int Maxflow(int s, int t){
this->s = s;
this->t = t;
int Flow = 0;
while(bfs()){
memcpy(cur, head, sizeof(head));
Flow += dfs(s, INF);
}
return Flow;
} }; int main()
{
int T, P, N, S, cnt;
scanf("%d", &T);
while(T--){
Dinic din;
scanf("%d%d", &P, &N);
for(int i = 1; i <= P; i++){
din.addEdge(0, i, 1);
scanf("%d", &cnt);
for(int j = 1; j <= cnt; j++){
scanf("%d", &S);
din.addEdge(i, P+S, 1);
}
}
for(int i = 1; i <= N; i++) din.addEdge(P+i, P+N+1, 1);
if(din.Maxflow(0, P+N+1) == P) puts("YES");
else puts("NO");
}
return 0;
}
hdu - 1083 - Courses的更多相关文章
- HDU 1083 Courses 【二分图完备匹配】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1083 Courses Time Limit: 20000/10000 MS (Java/Others) ...
- HDU 1083 - Courses - [匈牙利算法模板题]
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1083 Time Limit: 20000/10000 MS (Java/Others) M ...
- HDU - 1083 Courses /POJ - 1469
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083 http://poj.org/problem?id=1469 题意:给你P个课程,并且给出每个课 ...
- HDU 1083 Courses(二分图匹配模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1083 题意:有p门课和n个学生,每个学生都选了若干门课,每门课都要找一个同学来表演,且一个同学只能表演一门课,判 ...
- hdu 1083 Courses (最大匹配)
CoursesTime Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU 1083 Courses(最大匹配模版题)
题目大意: 一共有N个学生跟P门课程,一个学生可以任意选一 门或多门课,问是否达成: 1.每个学生选的都是不同的课(即不能有两个学生选同一门课) 2.每门课都有一个代表(即P门课都被成功选过 ...
- hdu 1083 Courses(二分图最大匹配)
题意: P门课,N个学生. (1<=P<=100 1<=N<=300) 每门课有若干个学生可以成为这门课的代表(即候选人). 又规定每个学生最多只能成为一门课的代 ...
- HUD——1083 Courses
HUD——1083 Courses Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- (匹配)Courses -- hdu --1083
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1083 http://acm.hust.edu.cn/vjudge/contest/view.action ...
随机推荐
- 【写一个自己的js库】 3.添加几个处理字符串的方法
1.生成重复的字符串 if(!String.repeat){ String.prototype.repeat = function (count){ return new Array(count + ...
- gem update --system 302 错误 解决方案(转)
具体过程如下: 1.InstantRails-2.0安装后,在配置环境变量path中配置ruby/bin目录(如果系统中有多个RUBY,执行命令行的时候系统认的就是path中的) 2.进入DOS命令行 ...
- bzoj2015 [Usaco2010 Feb]Chocolate Giving
Description Farmer John有B头奶牛(1<=B<=25000),有N(2*B<=N<=50000)个农场,编号1-N,有M(N-1<=M<=10 ...
- 怎么去掉word标题前的黑点
原文地址:http://jingyan.baidu.com/article/9c69d48f593c5b13c9024e2c.html 我们在使用word时,标题前总是出现黑点,其实这个黑点在打印时是 ...
- linux修改系统时间date命令加clock -w
http://m.jb51.net/LINUXjishu/117784.html 修改linux系统时间的方法(date命令) 11-18 23:22:27作者:脚本之家 命令格式为: date -s ...
- Cocos2d-x--Box2D绘制出两个矩形框的解决方案
一个简单的Demo,只是在程序窗口绘制出一个矩形 找到以下代码,注释掉其中一句 效果:
- eclipse/myeclipse使用技巧
热键篇: Template:Alt + / 修改处:Window->Preference->Workbench->Keys->Command->Edit->Cont ...
- UIButton 设置字体大小
btn.frame = CGRectMake(x, y, width, height); [btn setTitle: @"search" forState: UIControlS ...
- 用JS做图片轮播
脚本之家 首页应用手游攻略教程 ﹤首页 >> 网络编程 >> JavaScript >> 网页特效 >> 图象特效 js 图片轮播(5张图片) 作者:m ...
- 端口扫描器之java实现
端口扫描器之java实现 import java.net.*;import java.io.*;import java.awt.*;import java.awt.event.*;import j ...