http://acm.hdu.edu.cn/showproblem.php?pid=1083
题意:有n个学生,p个课程,现在要给每个课程配一个课代表(不能兼任),问能否达成。
题解:二分图匹配
代码
#include <iostream>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
#define N 305
using namespace std;
int G[N][N], vis[N], used[N];
int n, p;
bool Find(int u)
{
int i;
for(i = 1 ; i <= n ; i++)
{
if(!vis[i] && G[u][i])
{
vis[i] = 1;
if(!used[i] || Find(used[i]))
{
used[i] = u;
return true;
}
}
}
return false;
}
int main()
{
int a, b, i, ans, t;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &p, &n);
memset(G, 0, sizeof(G));
ans = 0;
for(i = 1 ; i <= p ; i++)
{
scanf("%d", &a);
while(a--)
{
scanf("%d", &b);
G[i][b] = 1;
}
}
memset(used, 0, sizeof(used));
for(i = 1 ; i <= p ; i++)
{
memset(vis, 0, sizeof(vis));
if(Find(i))
ans++;
}
if(ans == p)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}