网络流WA65分求调
查看原帖
网络流WA65分求调
420129
Nt_Tsumiki楼主2022/10/26 07:57
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

#define INF 1145141919

namespace Dinic {
    struct Node {
        int to,nxt,dis;
    }e[1000001];

    int tot=1,s,t,head[1000001],cur[1000001],vis[1000001];

    void add(int x,int y,int k) { e[++tot]=(Node){y,head[x],k},head[x]=tot; }

    bool bfs() {
        memset(vis,0,sizeof vis); vis[s]=1;
        std::queue<int> q; q.push(s);
        while (!q.empty()) {
            int x=q.front(); q.pop();
            for (int i=head[x];i;i=e[i].nxt) {
                int y=e[i].to; cur[x]=head[x];
                if (e[i].dis and !vis[y]) {
                    vis[y]=vis[x]+1;
                    q.push(y);
                }
            }
        }
        return vis[t];
    }

    int dfs(int x,int flow) {
        if (x==t) return flow;
        int res=0;
        for (int i=cur[x];i and flow;i=e[i].nxt) {
            int y=e[i].to; cur[x]=i;
            if (e[i].dis and vis[y]==vis[x]+1) {
                int k=dfs(y,std::min(e[i].dis,flow));
                e[i].dis-=k,e[i^1].dis+=k,res+=k,flow-=k;
            }
        }
        return res;
    }
}
using namespace Dinic;
using namespace std;
int n,m,ans,sum;
const int dx[]={0,0,1,-1},dy[]={1,-1,0,0};

int main() {
    scanf("%d%d",&n,&m); t=10*n*m+1;
    for (int i=1;i<=n;i++)
        for (int j=1,a;j<=m;j++) {
            scanf("%d",&a); sum+=a;
            if (((i-1)*m+j)%2) add(s,(i-1)*m+j,a),add((i-1)*m+j,s,0);
            else add((i-1)*m+j,t,a),add(t,(i-1)*m+j,0); 
        }
    for (int i=1;i<=n;i++)
        for (int j=1,b;j<=m;j++) {
            scanf("%d",&b); sum+=b;
            if (((i-1)*m+j)%2) add((i-1)*m+j,t,b),add(t,(i-1)*m+j,0);
            else add(s,(i-1)*m+j,b),add((i-1)*m+j,s,0); 
        }
    for (int i=1;i<=n;i++)
        for (int j=1,c;j<=m;j++) {
            scanf("%d",&c);
            for (int k=0;k<4;k++) {
                int nx=i+dx[k],ny=j+dy[k];
                if (nx<=0 or ny<=0 or nx>n or ny>m) continue;
                add(s,(k+1)*n*m+(i-1)*m+j,c),add((k+1)*n*m+(i-1)*m+j,s,0);
                add((k+1)*n*m+(i-1)*m+j,(i-1)*m+j,INF),add((i-1)*m+j,(k+1)*n*m+(i-1)*m+j,0);
                add((k+1)*n*m+(i-1)*m+j,(nx-1)*m+ny,INF),add((nx-1)*m+ny,(k+1)*n*m+(i-1)*m+j,0);
                add((k+5)*n*m+(i-1)*m+j,t,c),add(t,(k+5)*n*m+(i-1)*m+j,0);
                add((i-1)*m+j,(k+5)*n*m+(i-1)*m+j,INF),add((k+5)*n*m+(i-1)*m+j,(i-1)*m+j,0);
                add((nx-1)*m+ny,(k+5)*n*m+(i-1)*m+j,INF),add((k+5)*n*m+(i-1)*m+j,(nx-1)*m+ny,0);
                sum+=2*c;
            }
        }
    while (bfs()) ans+=dfs(s,INF);
    printf("%d\n",sum-ans);
    return 0;
}
2022/10/26 07:57
加载中...