首页 > 代码库 > POJ 1469

POJ 1469

简单的二分图匹配问题

 

 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 }

 

POJ 1469