Special Fish HDU - 3395(KM)

Special Fish

 HDU - 3395

题意: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\n",KM());
64     }
65 
66 }
View Code

 

posted @ 2017-08-18 14:59  yijiull  阅读(225)  评论(0编辑  收藏  举报