zoukankan      html  css  js  c++  java
  • 【COGS 1873】 [国家集训队2011]happiness(吴确) 最小割

    这是一种最小割模型,就是对称三角,中间双向边,我们必须满足其最小割就是满足题目条件的互斥关系的最小舍弃,在这道题里面我们S表示文T表示理,中间一排点是每个人,每个人向两边连其选文或者选理的价值,中间每两个点之间连他们的高兴度,然后我们就要分析,并作出改变,对于任意两个点我们要么割一个z要么两边某一边全割掉,那么我们割两边时不经舍弃了其选理(文)的价值还舍弃了他们一起的价值,对于z我们不仅要割掉了一文一理,而且还把所有的一起全部舍弃因此,于是理(文)边还要带一半的一起,中间的边为双向都为两个(半一起)。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define N 2005
    #define r register
    using namespace std;
    inline int read()
    {
        r int sum=0;
        r char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch>='0'&&ch<='9')
        {
            sum=(sum<<1)+(sum<<3)+ch-'0';
            ch=getchar();
        }
        return sum;
    }
    struct VIA
    {
        int to,next,f;
    }c[N*N*2];
    int head[N*N],t=1;
    int like[N][N][2];
    int n,m,S,T;
    int together1[N][N],together2[N][N];
    int Hash[N][N];
    inline void add(int x,int y,int z)
    {
        c[++t].to=y;
        c[t].f=z;
        c[t].next=head[x];
        head[x]=t;
    }
    int q[N*N],top,tail,deep[N*N];
    inline bool bfs()
    {
        memset(deep,0,sizeof(deep));
        q[1]=S;
        deep[S]=1;
        top=tail=1;
        while(top<=tail)
        {
          r int x=q[top++];
          if(x==T)return 1;
          for(int i=head[x];i;i=c[i].next)
          if(c[i].f&&deep[c[i].to]==0)
          {
            deep[c[i].to]=deep[x]+1;
            q[++tail]=c[i].to;
          }
        }
        return 0;
    }
    inline int Min(int x,int y)
    {
         return x<y?x:y;
    }
    int dfs(int x,int v)
    {
         if(x==T||!v)return v;
         r int ret=0;
         for(int i=head[x];i;i=c[i].next)
         if(c[i].f&&deep[c[i].to]==deep[x]+1)
         {
           r int f=Min(c[i].f,v);
           r int w=dfs(c[i].to,f);
           v-=w;
           ret+=w;
           c[i].f-=w;
           c[i^1].f+=w;
           if(!v)break;
         }
         if(!ret)deep[x]=-1;
         return ret;
    }
    inline int dinic()
    {
        r int ans=0;
        while(bfs())ans+=dfs(S,0x7f7f7f7f);
        return ans;
    }
    int main()
    {
        freopen("nt2011_happiness.in","r",stdin);
        freopen("nt2011_happiness.out","w",stdout);
        r int ans=0;
        n=read(),m=read();
        S=n*m+1;
        T=S+1;
        for(r int i=1;i<=n;++i)
          for(r int j=1;j<=m;++j)
            like[i][j][0]=2*read(),ans+=like[i][j][0];
        for(r int i=1;i<=n;++i)
          for(r int j=1;j<=m;++j)
            like[i][j][1]=2*read(),ans+=like[i][j][1];
        for(r int i=1,x;i<n;++i)
          for(r int j=1;j<=m;++j)
            x=read(),together1[i][j]=x,like[i][j][0]+=x,like[i+1][j][0]+=x,ans+=x*2;
        for(r int i=1,x;i<n;++i)
          for(r int j=1;j<=m;++j)
            x=read(),together1[i][j]+=x,like[i][j][1]+=x,like[i+1][j][1]+=x,ans+=x*2;
        for(r int i=1,x;i<=n;++i)
          for(r int j=1;j<m;++j)
            x=read(),together2[i][j]=x,like[i][j][0]+=x,like[i][j+1][0]+=x,ans+=x*2;
        for(r int i=1,x;i<=n;++i)
          for(r int j=1;j<m;++j)
            x=read(),together2[i][j]+=x,like[i][j][1]+=x,like[i][j+1][1]+=x,ans+=x*2;
        for(r int i=1;i<=n;++i)
          for(r int j=1;j<=m;++j)
            Hash[i][j]=(i-1)*m+j,add(S,Hash[i][j],like[i][j][0]),add(Hash[i][j],S,0),add(Hash[i][j],T,like[i][j][1]),add(T,Hash[i][j],0);
        for(r int i=1;i<n;++i)
          for(r int j=1;j<=m;++j)
            add(Hash[i][j],Hash[i+1][j],together1[i][j]),add(Hash[i+1][j],Hash[i][j],together1[i][j]);
        for(r int i=1;i<=n;++i)
          for(r int j=1;j<m;++j)
            add(Hash[i][j],Hash[i][j+1],together2[i][j]),add(Hash[i][j+1],Hash[i][j],together2[i][j]);
        ans-=dinic();
        ans/=2;
        printf("%d",ans);
    }
  • 相关阅读:
    js如何识别后端返回的“↵”,让其换行
    ReactNative插件
    ReactNative踩坑
    js对当前时间进行处理
    vue-awesome-swiper手动滑动后不再自动轮播的问题
    HTML5知识点汇总
    懒加载的实现原理及一些实现方法
    使用node.js实现多人聊天室(socket.io、B/S)
    [vue学习] 卡片展示分行功能简单实现
    [vue学习]快速搭建一个项目
  • 原文地址:https://www.cnblogs.com/TSHugh/p/7288900.html
Copyright © 2011-2022 走看看