POJ1469

二分图的最大匹配模板题

 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 }
原文地址:https://www.cnblogs.com/Mr-Xu-JH/p/4356175.html