hdu 1068 Girls and Boys

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

 

 

 

 

你可能感兴趣的:(HDU)