POJ 1469 COURSES

很明显,本题目求的是二分图的最大匹配问题,只要匹配等于课程门数,就可以结束程序输出“YES”,否则当循环完之后还没有覆盖住所有的课程,则输出‘NO’

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring> 
 4 using namespace std;
 5 #define MAXN 301
 6 int match[MAXN];
 7 int map[MAXN][MAXN];
 8 int vis[MAXN];
 9 int P,N; 
10 int find(int x)
11 {
12     for(int i = 1;i <=N;i++)
13     {
14         if(map[x][i]&&!vis[i])
15         {
16             vis[i] = 1;
17             if(!match[i] || find(match[i]))
18             {
19                 match[i] = x;
20                 return 1;
21             }
22         }
23     }
24     return 0;
25 } 
26 
27 int main()
28 {
29     int T,n,a; 
30     scanf("%d",&T);
31     while(T--)
32     {
33         memset(map,0,sizeof(map));
34         memset(match,0,sizeof(match));  
35         scanf("%d%d",&P,&N);
36         for(int i=1;i<=P;i++)
37         {
38             scanf("%d",&n);
39             for(int j=1;j<=n;j++)
40             {
41                     scanf("%d",&a);
42                     map[i][a]=1;    
43             }    
44         }
45         
46         int ans=0;
47         for(int i=1;i<=P;i++)
48         {
49             memset(vis,0,sizeof(vis)); 
50             ans+=find(i);
51             if(ans==P)
52             break;    
53         } 
54         
55         if(ans==P)
56         printf("YES\n");
57         else
58         printf("NO\n");    
59     } 
60     system("pause"); 
61     return 0;    
62 } 

 

posted on 2012-08-13 23:32  我的ACM之路  阅读(206)  评论(0编辑  收藏  举报

导航