#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[305][305];
int vis[305];
int link1[305];
int link2[305],p,n;
int dfs(int i)
{
int j;
for(j=1;j<=n;j++)
{
if(map[i][j]&&!vis[j])
{
vis[j]=1;
if(link1[j]==-1||dfs(link1[j]))
{
link1[j]=i;
link2[i]=j;
return 1;
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&p,&n);
int i,k,m;
memset(map,0,sizeof(map));
for(i=1;i<=p;i++)
{
scanf("%d",&m);
int j;
for(j=0;j<m;j++)
{
scanf("%d",&k);
map[i][k]=1;
}
}
int s=0;
memset(link1,-1,sizeof(link1));
memset(link2,-1,sizeof(link2));
for(i=1;i<=p;i++)
{
memset(vis,0,sizeof(vis));
dfs(i);
}
for(i=1;i<=p;i++)
{
if(link2[i]==-1)
break;
}
if(i>p)
printf("YES\n");
else
printf("NO\n");
}
}hdu1083
最新推荐文章于 2020-05-17 10:40:57 发布
本文介绍了一种基于二分图的匹配算法实现,通过深度优先搜索(DFS)完成最大匹配的过程。该算法应用于解决二分图中寻找最大匹配的问题,如任务分配等场景。文章详细展示了如何使用C++实现该算法,并提供了完整的代码示例。
862

被折叠的 条评论
为什么被折叠?



