二分图的最大匹配模板题
1 #include <cstdio> 2 #include <iostream> 3 #include <string.h> 4 using namespace std; 5 bool map[105][305],vis[305],flag; 6 int match[305]; 7 int p,n; 8 bool dfs(int a){ 9 for(int i=1;i<=n;i++){ 10 if(map[a][i]&&!vis[i]){ 11 vis[i]=1; 12 if(match[i]==-1||dfs(match[i])){ 13 match[i]=a; 14 return true; 15 } 16 } 17 } 18 return false; 19 } 20 int main(){ 21 int t,ans,k,a; 22 scanf("%d",&t); 23 while(t--){ 24 flag=1; 25 memset(map,false,sizeof(map)); 26 memset(match,-1,sizeof(match)); 27 scanf("%d%d",&p,&n); 28 for(int i=1;i<=p;i++){ 29 scanf("%d",&k); 30 if(!k)flag=0; 31 while(k--){ 32 scanf("%d",&a); 33 map[i][a]=1; 34 } 35 } 36 if(flag){ 37 ans=0; 38 for(int i=1;i<=p;i++){ 39 memset(vis,false,sizeof(vis)); 40 if(dfs(i))ans++; 41 } 42 if(ans==p)puts("YES"); 43 else puts("NO"); 44 } 45 else puts("NO"); 46 } 47 return 0; 48 }