题目类型:基本的二分匹配-二分图的最大匹配
算法实现:匈牙利算法
注意事项:本题使用scanf、printf,不要使用cout、cin,否则会超时。
#include <iostream>
//#include <conio.h>
using namespace std;
#define parray 101
#define narray 301
int map[parray][narray];
int match[narray];
bool final[narray];
int p,n; //p代表课程数,n代表学生数
bool DFS(int p)
{
int i,t;
for(i=1;i<=n;++i)
{
if(map[p][i] && !final[i])
{
final[i]= true;
t = match[i];
match[i] = p;
if(t==0 || DFS(t)) return true;
match[i] = t;
}
}
return false;
}
int mat()
{
int i,j;
int maxmatch = 0;
for(i=1;i<=p;++i)
{
memset(final,0,sizeof(final));
if(DFS(i)) maxmatch++;
}
return maxmatch;
}
int main()
{
//freopen("1.txt","r",stdin);
int t;
int i,j;
int temp,tempcount;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&p,&n);
memset(map,0,sizeof(map)); //初始化邻接矩阵
memset(match,0,sizeof(match)); //初始化匹配
for(i=1;i<=p;++i)
{
scanf("%d",&tempcount);
for(j=1;j<=tempcount;++j)
{
scanf("%d",&temp);
map[i][temp]=1;
}
}
if(mat()==p) //如果最大匹配数等于课程数
printf("YES\n");
else
printf("NO\n");
}
//getch();
return 0;
}