最大流
数据有些鬼。。开小容易RE,开大就MLE。。
存双向边
然后直接跑dinic
注意读入有些复杂= =
速度还是跟得上的
Problem: 1001
User: YJY
Language: C++
Result: Accepted
Time:2004 ms
Memory:106744 kb
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<cmath> #include<stack> #include<queue> using namespace std; #define INF 0x7fffffff #define MAXN 3000010 int n,m; int ans,k; struct Node { int to,next,v; }e[MAXN<<1]; int head[MAXN]; int dis[MAXN],q[MAXN]; void link(int u,int v,int w) { k++; e[k].to=v; e[k].v=w; e[k].next=head[u]; head[u]=k; } bool bfs() { queue<int>Q; int now; memset(dis,-1,sizeof(dis)); Q.push(1); dis[1]=0; while (!Q.empty()) { now=Q.front(); Q.pop(); for (int i=head[now];i;i=e[i].next) { if (e[i].v && dis[e[i].to]<0) { Q.push(e[i].to); dis[e[i].to]=dis[now]+1; } } } if (dis[n*m]==-1) return 0; return 1; } int dfs(int x,int f) { int w,used=0; if (x==n*m) return f; for (int i=head[x];i;i=e[i].next) { if (e[i].v && dis[e[i].to]==dis[x]+1) { w=f-used; w=dfs(e[i].to,min(w,e[i].v)); e[i].v-=w; e[i+1].v+=w; used+=w; if (used==f) return f; } } if (!used) dis[x]=-1; return used; } void dinic() { while (bfs()) ans+=dfs(1,INF); } int main() { scanf("%d%d",&n,&m); int x; for(int i=1;i<=n;i++) for(int j=1;j<m;j++) { scanf("%d",&x); link(m*(i-1)+j,m*(i-1)+j+1,x); link(m*(i-1)+j+1,m*(i-1)+j,x); } for(int i=1;i<n;i++) for(int j=1;j<=m;j++) { scanf("%d",&x); link(m*(i-1)+j,m*(i)+j,x); link(m*(i)+j,m*(i-1)+j,x); } for(int i=1;i<n;i++) for(int j=1;j<m;j++) { scanf("%d",&x); link(m*(i-1)+j,m*(i)+j+1,x); link(m*(i)+j+1,m*(i-1)+j,x); } dinic(); printf("%d",ans); return 0; }