Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2013 Accepted Submission(s): 876
这是本人第一次写二分图的题,一开始看题时有点懵了,后来得到大牛的指点,又看了一些关于二分图的书,才对二分图有了一丁点的了解:
其实本题主要是求最大孤立点集:最大独立集=点-最大匹配数;
但应该注意的是本体因为是从整个点集搜索,而并非是将点集分开成(A)(B)所以求最大匹配数时应该将最大匹配数/2;
运行代码:
1 #include<stdio.h>
2 #include<string.h>
3 int n;
4 int g[1000][1000];
5 int mark[1000],ym[1000];
6 int chk[1000];
7 int searchpath(int u)
8 {
9 int v;
10 for(v=0;v<n;v++)
11 if(g[u][v]==1 && !chk[v])
12 {
13 chk[v]=1;
14 if(ym[v]==-1 || searchpath(ym[v]))
15 {
16 ym[v]=u;mark[u]=1;
17 return 1;
18 }
19 }
20 return 0;
21 }
22 int maxmatch()
23 {
24 int u,ret=0;
25 memset(mark,0,sizeof(mark));
26 memset(ym,-1,sizeof(ym));
27 for(u=0;u<n;u++)
28 if(mark[u]==0)
29 {
30 memset(chk,0,sizeof(chk));
31 if(searchpath(u))
32 ret++;
33 }
34 return ret;
35 }
36 int main()
37 {
38 int i,j,s,c,a,b;
39 while(scanf("%d",&n)!=EOF)
40 {
41 memset(g,0,sizeof(g));
42 for(j=0;j<n;j++)
43 {
44 scanf("%d: (%d)",&a,&b);
45 for(i=1;i<=b;i++)
46 {
47 scanf("%d",&c);
48 g[a][c]=1;
49 }
50 }
51 printf("%d\n",n-maxmatch()/2);
52 }
53 return 0;
54 }
55