hdu 2768(最大独立集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2768

思路:把喜欢cat的和喜欢dog的看成两个集合,如果这两个集合有冲突,即cat.love==dog.hate或者cat.hate==dog.love,这连边,代表有矛盾,那么最后的结果不就是求一下最大独立集吗。

最大独立集=顶点数-最大匹配。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 #define MAXN 2222
 8 struct Node {
 9     string love;
10     string hate;
11 } cat[MAXN],dog[MAXN];
12 int cat_cnt,dog_cnt;
13 bool map[MAXN][MAXN];
14 bool mark[MAXN];
15 int ly[MAXN];
16 char s1[11],s2[11];
17 
18 int dfs(int u) {
19     for(int v=0; v<dog_cnt; v++) {
20         if(map[u][v]&&!mark[v]) {
21             mark[v]=true;
22             if(ly[v]==-1||dfs(ly[v])) {
23                 ly[v]=u;
24                 return 1;
25             }
26         }
27     }
28     return 0;
29 }
30 
31 int MaxMatch() {
32     int res=0;
33     memset(ly,-1,sizeof(ly));
34     for(int i=0; i<cat_cnt; i++) {
35         memset(mark,false,sizeof(mark));
36         res+=dfs(i);
37     }
38     return res;
39 }
40 
41 int main() {
42 //   freopen("1.txt","r",stdin);
43     int _case,c,d,v;
44     scanf("%d",&_case);
45     while(_case--) {
46         scanf("%d%d%d",&c,&d,&v);
47         cat_cnt=dog_cnt=0;
48         for(int i=0; i<v; i++) {
49             scanf("%s%s",s1,s2);
50             if(s1[0]=='C') {
51                 cat[cat_cnt].love=s1;
52                 cat[cat_cnt++].hate=s2;
53             } else {
54                 dog[dog_cnt].love=s1;
55                 dog[dog_cnt++].hate=s2;
56             }
57         }
58         memset(map,false,sizeof(map));
59         for(int i=0; i<cat_cnt; i++) {
60             for(int j=0; j<dog_cnt; j++) {
61                 if(cat[i].love==dog[j].hate||cat[i].hate==dog[j].love) {
62                     map[i][j]=true;
63                 }
64             }
65         }
66         int ans=MaxMatch();
67         printf("%d\n",v-ans);
68     }
69     return 0;
70 }
View Code

 

posted @ 2013-06-05 16:57  ihge2k  阅读(313)  评论(0编辑  收藏  举报