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)