#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>
#include <queue> //poj1469匈牙利算法(模板)
using namespace std;
int a[110][310]; //邻接矩阵,记录哪些边相连,相连则为1
int n, m, vis[310], use[310]; //vis表示节点是否使用, use表示相连的点
bool dfs(int x)
{
int t;
for(t=1; t<=m; ++t)
{
if(a[x][t]&&!vis[t])
{
vis[t]=1; //注意这里vis[t]=1就表示接下来不能再改变(固定),不管它后面怎么操作
if(use[t]==0||dfs(use[t]))
{
use[t]=x;
return true;
}
}
}
return false;
}
int main()
{
int T, i, t, j, s;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
memset(a, 0, sizeof(a));
memset(use, 0, sizeof(use));
for(i=1; i<=n; ++i)
{
scanf("%d", &j);
while(j--)
{
scanf("%d", &t);
a[i][t]=1; //i和t相连为一条边
}
}
for(i=1, s=0; i<=n; ++i)
{
memset(vis, 0, sizeof(vis));
if(dfs(i))
s++;
}
if(s==n)printf("YES\n");
else printf("NO\n");
}
return 0;
}
poj1469匈牙利算法(模板)
最新推荐文章于 2019-08-06 22:49:03 发布