//Poj1469
//匈牙利算法
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define MAX 1001
int n1,n2,m,ans;//n1 n2为二分图俩节点的个数,m为边数
int g[MAX][MAX];//图G的邻接矩阵
int vis[MAX];//Y集合中点i的访问标记
int link[MAX];//link[y]表示当前与y节点相邻的x节点
int n,p;
int dfs(int x){//判断从点X开始有没有增广路
for(int j = 1;j <= n;j++){
if(g[x][j] && !vis[j]){//连通并且没有没有被使用过
vis[j] = 1;
if(link[j] == -1 || dfs(link[j])){//没有配对 或者 构成增广序列
link[j] = x;
return 1;
}
}
}
return 0;
}
int main(){
int m;
scanf("%d",&m);
while(m--){
scanf("%d%d",&p,&n);
int count1 = 0;//记录最大匹配值
memset(g,0,sizeof(g));
memset(link,-1,sizeof(link));
int countt,student;
for(int i = 1;i <= p;i++){
scanf("%d",&countt);
for(int j = 1;j <= countt;j++){
scanf("%d",&student);
g[i][student] = 1;
}
}
for(int i = 1;i <= p;i++){
memset(vis,0,sizeof(vis));
if(dfs(i)) {
count1++;
//cout<<"11"<<endl;
}
}
// cout<<count1<<endl;
if(count1 == p) printf("YES\n");
else printf("NO\n");
}
return 0;
}
POJ 1469 COURSES
最新推荐文章于 2018-03-12 17:43:46 发布