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);
    }

    这里写图片描述

  • 相关阅读:
    js时间操作扩展方法
    C#异步调用与线程总结
    ERP笔记5系统服务水平
    HtmlAgilityPack不能解析<select><option>的解决方法
    qq掉线咒语:aidusort.as
    情商的管理
    错误:ORA01036: 非法的变量名/编号 的多种解决办法
    安装MySQLdb时出错:EnvironmentError: mysql_config not found
    Ubuntu12.04安装maven
    (转)ASP.NET 3.5 企业级开发
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532059.html
Copyright © 2011-2022 走看看