题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1083
题意是有n门课程,每一门课程有若干名学生,然后要求每门课程能不能选出一名学生当课代表,一个学生只能当一门课的课代表,如果可以输出YES,否则输出NO。
思路就是对课程和学生建有向图,然后跑匈牙利算法求最大匹配数,如果等于课程数就是YES。匈牙利算法的裸题...
AC代码:
#include <bits/stdc++.h>
#define maxn 305
using namespace std;
vector<int> G[maxn];
int pre[maxn];
int col[maxn];
bool vis[maxn];
int T,n,m;
void init(){
for(int i=0;i<=n;i++){
G[i].clear();
col[i] = 0;
}
}
bool dfs(int x){
for(int i=0;i<G[x].size();i++){
int v = G[x][i];
if(vis[v] == false){
vis[v] = true;
if(pre[v] == -1 || dfs(pre[v])){
pre[v] = x;
return true;
}
}
}
return false;
}
int Fun(){
int sum = 0;
memset(pre,-1,sizeof(pre));
for(int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
if(dfs(i)) sum ++;
}
return sum;
}
int main()
{
scanf("%d",&T);
while(T--){
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
for(int j=0;j<x;j++){
int xx;
scanf("%d",&xx);
G[i].push_back(xx);
}
}
int ans = Fun();
if(ans == n){
puts("YES");
}
else{
puts("NO");
}
}
return 0;
}