这道题想了一下是一一对应,刚好符合二分匹配,也是最基本的二分匹配但是有个地方写错了,搞成双递归了,bs啊
专业模板。
#include<iostream>
#include<string>
using namespace std;
int used[310],link[310],mat[310][310];
int n,m;
int path(int t)
{
int i;
for(i=1;i<=m;i++)
{
if(!used[i]&&mat[t][i])
{
used[i]=1;
if(link[i]==-1||path(link[i]))//当时写错了。TLE
{
link[i]=t;
return 1;
}
}
}
return 0;
}
int main()
{
int i,num,t,tmp,cou,j;
scanf("%d",&t);
while(t--)
{
memset(mat,0,sizeof(mat));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&tmp);
for(j=1;j<=tmp;j++)
{
scanf("%d",&cou);
mat[i][cou]=1;
}
}
num=0;
memset(link,-1,sizeof(link));
for(i=1;i<=n;++i)
{
memset(used,0,sizeof(used));
if(path(i))
num++;
}
if(num==n)
printf("YES/n");
else
printf("NO/n");
}
return 0;
}