Special Fish
题意:n条鱼,被攻击后会产卵,如果i攻击j,那么后代会有g[i]^g[j]的值,求所有后代和的最大值。
KM
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxn=110; 5 int c[maxn][maxn]; 6 int vb[maxn],vg[maxn],eb[maxn],eg[maxn]; 7 int mc[maxn],d; 8 int g[maxn]; 9 int n; 10 int dfs(int x){ 11 vg[x]=1; 12 for(int i=0;i<n;i++){ 13 if(vb[i]) continue; 14 int gap=eg[x]+eb[i]-c[x][i]; 15 if(gap==0){ 16 vb[i]=1; 17 if(mc[i]==-1||dfs(mc[i])){ 18 mc[i]=x; 19 return 1; 20 } 21 }else d=min(d,gap); 22 } 23 return 0; 24 } 25 int KM(){ 26 memset(mc,-1,sizeof(mc)); 27 memset(eb,0,sizeof(eb)); 28 for(int i=0;i<n;i++){ 29 eg[i]=c[i][0]; 30 for(int j=1;j<n;j++) 31 eg[i]=max(c[i][j],eg[i]); 32 } 33 34 for(int i=0;i<n;i++){ 35 while(1){ 36 memset(vb,0,sizeof(vb)); 37 memset(vg,0,sizeof(vg)); 38 d=inf; 39 if(dfs(i)) break; 40 for(int j=0;j<n;j++) { 41 if(vg[j]) eg[j]-=d; 42 if(vb[j]) eb[j]+=d; 43 } 44 } 45 } 46 int ans=0; 47 for(int i=0;i<n;i++) 48 ans+=c[mc[i]][i]; 49 return ans; 50 } 51 52 int main(){ 53 char cc[110]; 54 while(scanf("%d",&n)&&n){ 55 memset(c,0,sizeof(c)); 56 for(int i=0;i<n;i++)scanf("%d",&g[i]); 57 for(int i=0;i<n;i++){ 58 scanf("%s",cc); 59 for(int j=0;j<n;j++){ 60 if(cc[j]=='1') c[i][j]=g[i]^g[j]; 61 } 62 } 63 printf("%d ",KM()); 64 } 65 66 }