zoukankan      html  css  js  c++  java
  • BZOJ 2127 二元关系

    题意:
    这里写图片描述
    思路:
    这里写图片描述
    这里写图片描述
    这里写图片描述

    先把所有的值加起来

    最小割割哪儿 就代表那个地方不选
    一减 剩下的就是 最大值了

    //By SiriusRen
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int N=105,M=10005,K=300050,inf=0x3f3f3f3f;
    int n,m,T,cnt,tot,ans;
    int A[N][N],B[N][N],C[N][N],D[N][N],E[N][N],F[N][N],id[N][N];
    int first[M],next[K],v[K],w[K],q[M],vis[M];
    void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
    void add(int x,int y,int z){Add(x,y,z),Add(y,x,0);}
    bool tell(){
        memset(vis,-1,sizeof(vis)),vis[0]=0;
        int head=0,tail=0;
        while(head<=tail){
            int t=q[head++];
            for(int i=first[t];~i;i=next[i])if(!~vis[v[i]]&&w[i])
                vis[v[i]]=vis[t]+1,q[++tail]=v[i];
        }return ~vis[T];
    }
    int zeng(int x,int y){
        if(x==T)return y;
        int r=0;
        for(int i=first[x];~i&&y>r;i=next[i])if(vis[v[i]]==vis[x]+1&&w[i]){
            int t=zeng(v[i],min(y-r,w[i]));
            w[i]-=t,w[i^1]+=t,r+=t;
        }if(!r)vis[x]=-1;
        return r;
    }
    int main(){
        memset(first,-1,sizeof(first));
        scanf("%d%d",&n,&m),T=n*m+1;
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&A[i][j]),id[i][j]=++cnt;
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&B[i][j]);
        for(int i=1;i<n;i++)for(int j=1;j<=m;j++)scanf("%d",&C[i][j]);
        for(int i=1;i<n;i++)for(int j=1;j<=m;j++)scanf("%d",&D[i][j]);
        for(int i=1;i<=n;i++)for(int j=1;j<m;j++)scanf("%d",&E[i][j]);
        for(int i=1;i<=n;i++)for(int j=1;j<m;j++)scanf("%d",&F[i][j]);
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
            add(0,id[i][j],A[i][j]*2),add(id[i][j],T,B[i][j]*2),ans+=A[i][j]+B[i][j];
        for(int i=1;i<n;i++)for(int j=1;j<=m;j++){
            add(0,id[i][j],C[i][j]),add(0,id[i+1][j],C[i][j]);
            add(id[i][j],T,D[i][j]),add(id[i+1][j],T,D[i][j]);
            add(id[i][j],id[i+1][j],C[i][j]+D[i][j]);
            add(id[i+1][j],id[i][j],C[i][j]+D[i][j]);
            ans+=C[i][j]+D[i][j];
        }
        for(int i=1;i<=n;i++)for(int j=1;j<m;j++){
            add(0,id[i][j],E[i][j]),add(0,id[i][j+1],E[i][j]);
            add(id[i][j],T,F[i][j]),add(id[i][j+1],T,F[i][j]);
            add(id[i][j],id[i][j+1],E[i][j]+F[i][j]);
            add(id[i][j+1],id[i][j],E[i][j]+F[i][j]);
            ans+=E[i][j]+F[i][j];
        }ans*=2;
        while(tell())while(m=zeng(0,inf))ans-=m;
        printf("%d
    ",ans/2);
    }

    这里写图片描述

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532059.html
Copyright © 2011-2022 走看看