1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std;
const int N=405,M=N*6,INF=0x3f3f3f3f; #define ci const int &
class SurroundingGame{ private: struct GRAPH{ int head[N<<1],cap[M<<1],nxt[M<<1],to[M<<1],ncnt; GRAPH(){ncnt=1;} void AddEdge(ci u,ci v,ci varc){ int p=++ncnt,q=++ncnt; to[p]=v,nxt[p]=head[u],head[u]=p,cap[p]=varc; to[q]=u,nxt[q]=head[v],head[v]=q,cap[q]=0; } inline int operator [](ci u){return head[u];} }Gr; int dep[N<<1],head[N<<1],St,Ed,n,m; inline int index(ci x,ci y,ci i){return 2*(x*m+y)+i;} bool BFS(){ for(int i=1;i<=Ed;i++) dep[i]=-1,head[i]=Gr[i]; queue<int> que;que.push(St),dep[St]=0; while(!que.empty()){ int u=que.front();que.pop(); for(int it=head[u];it;it=Gr.nxt[it]){ int v=Gr.to[it]; if((~dep[v]) || !Gr.cap[it]) continue; dep[v]=dep[u]+1; if(v==Ed) return true; que.push(v); } } return false; } int Aug(ci u,ci in){ if(u==Ed) return in; int out=0; for(int &it=head[u];it;it=Gr.nxt[it]){ int v=Gr.to[it]; if(!Gr.cap[it] || dep[v]!=dep[u]+1) continue; int tov=Aug(v,min(in-out,Gr.cap[it])); out+=tov,Gr.cap[it]-=tov,Gr.cap[it^1]+=tov; if(in==out) break; } return out; } int Dinic(){ int ret=0; while(BFS()) ret+=Aug(St,INF); return ret; } int charint(const char &c){ if('0'<=c && c<='9') return c-'0'; if('a'<=c && c<='z') return c-'a'+10; return c-'A'+36; } bool law(ci x,ci y){return 0<=x && x<n && 0<=y && y<m;} public: int maxScore(vector<string> cost,vector<string> value){ n=cost.size(),m=cost[0].length(); St=n*m*2+1,Ed=St+1; const int DIR[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int ans=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++){ if((i+j)&1){ Gr.AddEdge(St,index(i,j,1),charint(cost[i][j])); Gr.AddEdge(index(i,j,1),index(i,j,2),charint(value[i][j])); for(int k=0;k<4;k++){ int p=i+DIR[k][0],q=j+DIR[k][1]; if(law(p,q)) Gr.AddEdge(index(i,j,2),index(p,q,1),INF); } } else{ Gr.AddEdge(index(i,j,1),Ed,charint(cost[i][j])); Gr.AddEdge(index(i,j,2),index(i,j,1),charint(value[i][j])); for(int k=0;k<4;k++){ int p=i+DIR[k][0],q=j+DIR[k][1]; if(law(p,q)) Gr.AddEdge(index(p,q,1),index(i,j,2),INF); } } ans+=charint(value[i][j]); } return ans-Dinic(); } }test;
|