出了一个误区没翻译好,就是委员会是依次出来的,我以为是输入的.
代码:
#include <iostream>
#include <stdio.h>
#include<string>
using namespace std;
int map[1501][1501];
int match[1501];//X对应在Y中匹配的点
int visit[1501];
int xn,ym;//X,Y集合
int n,p,k,t,c;
bool dfs(int p)
{
int x;
for(x=1;x<=ym;x++)
{
if(map[p][x]==1 && visit[x]==-1)
{
visit[x]=1;
if(match[x]==-1 || dfs(match[x]))
{
match[x]=p;
return true;
}
}
}
return false;
}
int find_match()
{
memset(match,-1,sizeof(match));
int i,sum=0;
for(i=1;i<=xn;i++)
{
memset(visit,-1,sizeof(visit));
if(dfs(i)) sum++;
}
return sum;
}
int main()
{
int i,j,a,b,res;
//freopen("in.txt","r",stdin);
scanf("%d",&k);
while(scanf("%d%d",&p,&n)!=EOF)
{
xn=p;ym=n;
for(i=1;i<=1500;i++)
for(j=1;j<=1500;j++) map[i][j]=0;
for(i=1;i<=p;i++)
{
scanf("%d",&c);
for(j=1;j<=c;j++){
scanf("%d",&a);
map[i][a]=1;
}
}
res=find_match();
if(res==p)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}