POJ 1469 COURSES(二分图最大匹配)

题目链接:http://poj.org/problem?id=1469 

复习了下二分图最大匹配,找了道水题。。

水题的样例真水,打错一个字母都能过样例。。。。

 

关于二分图最大匹配的资料见:http://www.cnblogs.com/pony1993/archive/2012/07/25/2607738.html 

 

思路:只要最大匹配数=课程数就OK

 

代码:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4  using  namespace std;
 5  const  int N= 1001;
 6  int n1,n2,k;
 7  int map[N][N],vis[N],link[N];
 8  int find( int x)
 9 {
10      int i;
11      for(i= 0;i<=n2;i++)
12     {
13          if(map[x][i]&&!vis[i])
14         {
15             vis[i]= 1;
16              if(link[i]== 0||find(link[i]))
17             {
18                 link[i]=x;
19                  return  1;
20             }
21         }
22     }
23      return  0;
24 }
25  int main()
26 {
27      int t,i,n,x,sum;
28     scanf( " %d ",&t);
29      while(t--)
30     {
31         memset(map, 0, sizeof(map));
32         memset(link, 0, sizeof(link));
33         sum= 0;
34         scanf( " %d%d ",&n1,&n2);
35          for(i= 1;i<=n1;i++)
36         {
37             scanf( " %d ",&n);
38              while(n--)
39             {
40                 scanf( " %d ",&x);
41                 map[i][x]= 1;
42             }
43         }
44          for(i= 1;i<=n1;i++)
45         {
46             memset(vis, 0, sizeof(vis));
47              if(find(i))
48                 sum++;
49         }
50          if(sum==n1)
51             puts( " YES ");
52          else
53             puts( " NO ");
54     }
55      return  0;
56 }


你可能感兴趣的:(poj)