简单的二分图匹配问题

 

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 using namespace std;
 5 #define N 305
 6 int g[N][N] , visx[N] , visy[N] , cx[N] , cy[N] , p , n;
 7 
 8 int dfs(int u)
 9 {
10     for(int v = 1 ; v <= n ; v++){
11         if(g[u][v] && !visy[v]){
12             visy[v] = 1;
13             if(cy[v] == -1 || dfs(cy[v])){
14                 cx[u] = v;
15                 cy[v] = u;
16                 return 1;
17             }
18         }
19     }
20     return 0;
21 }
22 
23 int MaxMatch()
24 {
25     int ans = 0;
26     memset(cx , -1 , sizeof(cx));
27     memset(cy , -1 , sizeof(cy));
28     for(int i=1 ; i<=p ; i++){
29         if(cx[i] == -1){
30             memset(visy , 0 , sizeof(visy));
31             ans += dfs(i);
32         }
33     }
34     return ans;
35 }
36 
37 int main()
38 {
39    // freopen("a.in" , "r" , stdin);
40     int T;
41     scanf("%d" , &T);
42     while(T--)
43     {
44         scanf("%d%d" , &p , &n);
45         memset(g , 0 , sizeof(g));
46         for(int i = 1 ; i<=p ; i++){
47             int k , id;
48             scanf("%d" , &k);
49             for(int j=0 ; j<k ; j++){
50                 scanf("%d" , &id);
51                 g[i][id] = 1;
52             }
53         }
54         if(MaxMatch() == p) puts("YES");
55         else puts("NO");
56     }
57     return 0;
58 }

 

 posted on 2015-01-16 00:41  Love风吟  阅读(191)  评论(0编辑  收藏  举报