poj 1466 Girls and Boys (最大独立集)

http://poj.org/problem?id=1466

题意:一些 boys 和girls  有暧昧关系,我们要选出 一些人,这些人 任意两个人之间没有暧昧 关系,求最多可以选出 多少人。

题解:

 最大独立集,这里建的是双向图,所以,最大匹配要除以 2;

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include< set>
 7 #include<map>
 8 #include<queue>
 9 #include<vector>
10 #include< string>
11  #define Min(a,b) a<b?a:b
12  #define Max(a,b) a>b?a:b
13  #define CL(a,num) memset(a,num,sizeof(a));
14  #define eps  1e-6
15  #define inf 10001000
16 
17  #define ll   __int64
18 
19  #define  read()  freopen("data.txt","r",stdin) ;
20  const  double pi  = acos(- 1.0);
21  const  int maxn =  510;
22 
23  using  namespace std;
24  int n;
25  int mat[maxn][maxn],result[maxn],vis[maxn] ;
26 
27  int find( int a)
28 {
29      int i ;
30      for(i =  0 ; i < n;i++)
31     {
32          if(mat[a][i]&&!vis[i])
33         {
34             vis[i] =  1;
35              if(result[i] ==  0||find(result[i]))
36             {
37                 result[i] = a ;
38                  return  1 ;
39 
40             }
41         }
42     }
43      return  0 ;
44 }
45 
46  int main()
47 {
48      // read();
49       int cas =  0,i ,a,num,b;
50      while(scanf( " %d ",&n)!=EOF)
51     {
52        CL(result, 0);
53        CL(mat, 0) ;
54         for(i =  0 ; i < n;i++)
55        {
56            scanf( " %d: (%d) ",&a,&num);
57             while(num--)
58            {
59                scanf( " %d ",&b);
60                mat[a][b] =  1;
61            }
62        }
63         int ans =  0 ;
64         for(i = 0 ;i < n;i++)
65        {
66            CL(vis, 0);
67             if(find(i))ans++;
68        }
69 
70        printf( " %d\n ",n - ans/ 2);
71     }
72 }

 

 

 

你可能感兴趣的:(poj)