简单的二分图匹配问题
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 }