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 }