题目链接: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 }
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 }