题意:一个动物园里有N只猫和K只狗,一些小朋友来参观,他们如果喜欢狗就不喜欢猫,喜欢猫就不喜欢狗,园长想要移走一些动物,如果,移走的是某个小朋友不喜欢的,而喜欢的没被移走,该小朋友就会高兴,求移动的数目使得最多的小朋友开心
Sample Input
1 1 2 //1个猫1个狗2个小朋友
C1 D1 //一号小朋友喜欢c1,讨厌d1
D1 C1
1 2 4
C1 D1
C1 D1
C1 D2
D2 C1
转换为最大独立集做
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 #define for0n for(i=0;i<n;i++) 9 #define for1n for(i=1;i<=n;i++) 10 #define cl(a) memset(a,0,sizeof(a)) 11 #define w12 while(scanf("%d%d",&n,&m)!=EOF) 12 int n,m,t; 13 const int MAXN = 1510; 14 int uN,vN;//u,v的数目,使用前面必须赋值 15 int g[MAXN][MAXN];//邻接矩阵 16 int linker[MAXN]; 17 bool used[MAXN]; 18 bool dfs(int u) 19 { 20 for(int v = 0; v < vN;v++) 21 if(g[u][v] && !used[v]) 22 { 23 used[v] = true; 24 if(linker[v] == -1 || dfs(linker[v])) 25 { 26 linker[v] = u; 27 return true; 28 } 29 } 30 return false; 31 } 32 int hungary() 33 { 34 int res = 0; 35 memset(linker,-1,sizeof(linker)); 36 for(int u = 0;u < uN;u++) 37 { 38 memset(used,false,sizeof(used)); 39 if(dfs(u))res++; 40 } 41 return res; 42 } 43 int main() 44 { 45 int i,j,k; 46 #ifndef ONLINE_JUDGE 47 freopen("1.in","r",stdin); 48 #endif 49 char s1[MAXN][5],s2[MAXN][5]; 50 int p; 51 while(scanf("%d%d%d",&n,&m,&p)!=EOF) 52 { 53 cl(g); 54 for(i=0;i<p;i++) 55 { 56 scanf("%s%s",s1[i],s2[i]); 57 } 58 uN=vN=p; 59 for(i=0;i<p;i++) 60 { 61 for(j=i+1;j<p;j++) 62 { 63 if(strcmp(s1[i],s2[j])==0||strcmp(s1[j],s2[i])==0) 64 { 65 g[i][j]=1; 66 g[j][i]=1; 67 } 68 } 69 } 70 printf("%d ",p-hungary()/2); 71 } 72 }