Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=2768

二分图匹配

最大独立集=节点数-最大匹配数

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 
 5 const int N=510;
 6 struct vote
 7 {
 8     char l[5],h[5];
 9 }v[N];
10 int g[N][N],n;
11 int mat[N];
12 bool vis[N];
13 bool ok(int i,int j)
14 {
15     return strcmp(v[i].l,v[j].h)!=0 && strcmp(v[i].h,v[j].l)!=0;
16 }
17 bool find(int u)
18 {
19     for(int v=0;v<n;v++) if(g[u][v])
20     {
21         if(vis[v]) continue;
22         vis[v]=true;
23         if(mat[v]==-1 || find(mat[v]))
24         {
25             mat[v]=u;
26             return true;
27         }
28     }
29     return false;
30 }
31 int maxmatch()
32 {
33     int cnt=0;
34     memset(mat,-1,sizeof(mat));
35     for(int i=0;i<n;i++)
36     {
37         memset(vis,0,sizeof(vis));
38         if(find(i)) cnt++;
39     }
40     return cnt;
41 }
42 int main()
43 {
44     int T;
45     scanf("%d",&T);
46     while(T--)
47     {
48         memset(g,0,sizeof(g));
49         int nc,nd;
50         scanf("%d%d%d",&nc,&nd,&n);
51         for(int i=0;i<n;i++)
52         {
53             scanf("%s%s",v[i].l,v[i].h);
54             for(int j=0;j<i;j++)
55                 if(!ok(i,j)) g[i][j]=g[j][i]=1;
56         }
57         int ans=n-maxmatch()/2;
58         printf("%d\n",ans);
59     }
60     return 0;
61 }

 

posted on 2012-05-20 18:32  Qiuqiqiu  阅读(268)  评论(0编辑  收藏  举报