这题是卡了dinic吗/yiw/yiw/yiw
一开始一直MLE,以为爆栈之类的(?),在本地测发现是能跑出来的,就只是太慢了而已
虽然这个数据范围本来就不应该过就是了
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct Edge{
int u,v;
long long c,w;
};
struct dinic{
const static int N=905005;
int n,m,s,t;
vector<Edge>E;
vector<int>to[N];
int d[N],C[N];//去掉了当前弧优化 | 又加上了(
bool vis[N];
void clear(int n){
for(int i=1;i<=n;i++)
to[i].clear();
E.clear();
}
void AddEdge(int u,int v,long long w){
E.push_back({u,v,w,0});
E.push_back({v,u,0,0});
m=E.size();
to[u].push_back(m-2);
to[v].push_back(m-1);
}
bool bfs(){
memset(vis,0,sizeof(vis));
queue<int>que;
que.push(s);
d[s]=0;
vis[s]=1;
while(!que.empty()){
int cur=que.front();
que.pop();
for(int i=0;i<to[cur].size();i++){
Edge& x=E[to[cur][i]];
if(!vis[x.v]&&x.c>x.w){
vis[x.v]=1;
d[x.v]=d[cur]+1;
que.push(x.v);
}
}
}
return vis[t];
}
long long dfs(int u,long long v){
if(u==t||v==0)
return v;
long long w=0,f;
for(int i=C[u];i<to[u].size();i++){
C[u]=i;
Edge& e=E[to[u][i]];
if(d[u]+1==d[e.v]&&(f=dfs(e.v,min(v,e.c-e.w)))>0){
e.w+=f;
E[to[u][i]^1].w-=f;
w+=f;
v-=f;
if(v==0)
break;
}
}
return w;
}
long long Maxflow(int s,int t){
this->s=s;
this->t=t;
long long res=0;
while(bfs()){
memset(C,0,sizeof(C));
res+=dfs(s,1e18);
}
return res;
}
}R;
int Iterator(int u,int v){
return (u-1)*m+v;
}
int main(){
// freopen("P4001_5.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1,u;i<=n;i++)
for(int j=1;j<m;j++){
scanf("%d",&u);
R.AddEdge(Iterator(i,j),Iterator(i,j+1),u);
R.E[R.m-1].c=u;
// R.AddEdge(Iterator(i,j+1),Iterator(i,j),u);
}
for(int i=1,u;i<n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&u);
R.AddEdge(Iterator(i,j),Iterator(i+1,j),u);
R.E[R.m-1].c=u;
// R.AddEdge(Iterator(i+1,j),Iterator(i,j),u);
}
for(int i=1,u;i<n;i++)
for(int j=1;j<m;j++){
scanf("%d",&u);
R.AddEdge(Iterator(i,j),Iterator(i+1,j+1),u);
R.E[R.m-1].c=u;
// R.AddEdge(Iterator(i+1,j+1),Iterator(i,j),u);
}
printf("%lld",R.Maxflow(Iterator(1,1),Iterator(n,m)));
}/*
*/