题目链接: hdu 1083
题目大意: 给你N种课程和M个学生,每个学生有自己喜欢的课程
若每个课程都能有一个学生代表输出YES,否则NO
解题思路: 把课程作为X集合,学生作为Y集合
匈牙利求他们之间的最大匹配数
若最大匹配数等于课程数(不可能大于的),则满足题意
每种课程都有学生作为代表
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 505
int edge[105][MAX];
int P,n,cx[105],cy[MAX],visit[MAX];
int DFS(int u) //匈牙利DFS增广
{
int i;
for(i=1;i<=n;i++)
{
if(edge[u][i]&&!visit[i])
{
visit[i]=1;
if( !cy[i] || DFS(cy[i]) )
{
cx[u]=i;
cy[i]=u;
return 1;
}
}
}
return 0;
}
int main()
{
int t,i,j,a,b,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&P,&n);
sum=0;
memset(cx,0,sizeof(cx));
memset(cy,0,sizeof(cy));
memset(edge,0,sizeof(edge));
for(i=1;i<=P;i++)
{
scanf("%d",&a);
for(j=1;j<=a;j++)
{
scanf("%d",&b);
edge[i][b]=1; //单向边
}
}
for(i=1;i<=P;i++)
{
if(!cx[i])
{
memset(visit,0,sizeof(visit));
sum+=DFS(i); //增广轨
}
}
if(sum==P) //若最大匹配数等于课程数输出YES
printf("YES\n");
else
printf("NO\n");
}
return 0;
}