想着复习一下Dinic,刚好看到这题不知道为什么之前没有AC。
然后看到了这个:
%%%%%%%%%%
突然觉得心好累。。。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#define num1 (x1-1)*m+y1
#define num2 (x2-1)*m+y2
using namespace std;
struct edge {
int to,v;
}e[6000010];
vector<int> a[1000010];
int dep[1000010],q[1000010],st,en,cnt,ans,inf,m,n;
void inse(int x,int y,int v){
e[cnt].to=y;e[cnt].v=v;
a[x].push_back(cnt++);
}
bool bfs(){
int u;edge ee;
memset(dep,0,sizeof(dep));
int t=0,h=1;q[++t]=st,dep[st]=1;
while (h<=t){
u=q[h];h++;
for (int i=0;i<a[u].size();i++){
edge ee=e[a[u][i]];
if (!dep[ee.to]&&(ee.v>0)){
dep[ee.to]=dep[u]+1;
q[++t]=ee.to;
}
}
}
return (dep[en]>0);
}
int dfs(int s,int flow){
if (s==en) return flow;
int tmp,usd=0;
for (int i=0;i<a[s].size();i++){
int j=a[s][i];
if (dep[e[j].to]!=dep[s]+1) continue;
tmp=flow-usd;
tmp=dfs(e[j].to,min(tmp,e[j].v));
e[j].v-=tmp;e[j^1].v+=tmp;
usd+=tmp;
if (usd==flow) return flow;
}
if (!usd) dep[s]=1;
return usd;
}
void dinic(){
while (bfs()) ans+=dfs(st,inf);
}
int main(){
inf=2147483647;
scanf("%d%d",&n,&m);
if (n==1&&m==1) {
printf("0\n");
return 0;
}
st=1;en=n*m;
int v,x1,x2,y1,y2;
for (int i=1;i<=n;i++)
for (int j=1;j<m;j++){
x1=i;y1=j;x2=i;y2=j+1;
scanf("%d",&v);
inse(num1,num2,v);
inse(num2,num1,v);
}
for (int i=1;i<n;i++)
for (int j=1;j<=m;j++){
x1=i;y1=j;x2=i+1;y2=j;
scanf("%d",&v);
inse(num1,num2,v);
inse(num2,num1,v);
}
for (int i=1;i<n;i++)
for (int j=1;j<m;j++){
x1=i;y1=j;x2=i+1;y2=j+1;
scanf("%d",&v);
inse(num1,num2,v);
inse(num2,num1,v);
}
dinic();
printf("%d\n",ans);
}