zoukankan      html  css  js  c++  java
  • bzoj 2127: happiness

      1 #include<cstdio>
      2 #include<iostream>
      3 #include<cstring>
      4 #define M 100009
      5 #define inf 2139062143
      6 using namespace std;
      7 int n,m,a[102][102],b[102][102],c[102][102],tot,cnt=1,T,ans,head[M],d[M],q[2*M],next[10*M],u[10*M],v[10*M];
      8 int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0};
      9 bool bfs()
     10 {
     11     memset(d,0,sizeof(int)*(T+1));
     12     int h=0,t=1;
     13     q[1]=0;
     14     d[0]=1;
     15     for(;h<t;)
     16       {
     17         h++;
     18         int p=q[h];
     19         for(int i=head[p];i;i=next[i])
     20           if(!d[u[i]]&&v[i])
     21             {
     22                 d[u[i]]=d[p]+1;
     23                 if(d[T])
     24                   return 1;
     25                 t++;
     26                 q[t]=u[i];
     27             }
     28       }
     29     return 0;
     30 }
     31 int dinic(int s,int f)
     32 {
     33     if(s==T)
     34       return f;
     35     int rest=f;
     36     for(int i=head[s];i&&rest;i=next[i])
     37       if(v[i]&&d[u[i]]==d[s]+1)
     38         {
     39             int now=dinic(u[i],min(rest,v[i]));
     40             if(!now)
     41               d[u[i]]=0;
     42             v[i]-=now;
     43             v[i^1]+=now;
     44             rest-=now;
     45         }
     46     return f-rest;  
     47 }
     48 void jia1(int a1,int a2,int a3)
     49 {
     50     cnt++;
     51     next[cnt]=head[a1];
     52     head[a1]=cnt;
     53     u[cnt]=a2;
     54     v[cnt]=a3;
     55     return;
     56 }
     57 void jia(int a1,int a2,int a3)
     58 {
     59     jia1(a1,a2,a3);
     60     jia1(a2,a1,0);
     61     return;
     62 }
     63 int main()
     64 {
     65     scanf("%d%d",&n,&m);
     66     T=n*m+1;
     67     for(int i=1;i<=n;i++)
     68       for(int j=1;j<=m;j++)
     69         {
     70           scanf("%d",&a[i][j]);
     71           tot+=a[i][j];    
     72           a[i][j]*=2;
     73         }
     74     for(int i=1;i<=n;i++)
     75       for(int j=1;j<=m;j++)
     76         {
     77           scanf("%d",&b[i][j]);
     78           tot+=b[i][j];
     79           b[i][j]*=2;
     80         }
     81     for(int i=1;i<n;i++)
     82       for(int j=1;j<=m;j++)
     83         {
     84             int a1;
     85             scanf("%d",&a1);
     86             tot+=a1;
     87             a[i][j]+=a1;
     88             a[i+1][j]+=a1;
     89             jia((i-1)*m+j,i*m+j,a1);
     90             jia(i*m+j,(i-1)*m+j,a1);
     91         }
     92     for(int i=1;i<n;i++)
     93       for(int j=1;j<=m;j++)
     94         {
     95             int a1;
     96             scanf("%d",&a1);
     97             tot+=a1;
     98             b[i][j]+=a1;
     99             b[i+1][j]+=a1;
    100             jia((i-1)*m+j,i*m+j,a1);
    101             jia(i*m+j,(i-1)*m+j,a1);
    102         }
    103     for(int i=1;i<=n;i++)
    104       for(int j=1;j<m;j++)
    105         {
    106             int a1;
    107             scanf("%d",&a1);
    108             tot+=a1;
    109             a[i][j]+=a1;
    110             a[i][j+1]+=a1;
    111             jia((i-1)*m+j,(i-1)*m+j+1,a1);
    112             jia((i-1)*m+j+1,(i-1)*m+j,a1);
    113         }
    114     for(int i=1;i<=n;i++)
    115       for(int j=1;j<m;j++)
    116         {
    117             int a1;
    118             scanf("%d",&a1);
    119             tot+=a1;
    120             b[i][j]+=a1;
    121             b[i][j+1]+=a1;
    122             jia((i-1)*m+j,(i-1)*m+j+1,a1);
    123             jia((i-1)*m+j+1,(i-1)*m+j,a1);
    124         }   
    125     for(int i=1;i<=n;i++)
    126       for(int j=1;j<=m;j++)
    127         {
    128             jia(0,(i-1)*m+j,a[i][j]);
    129             jia((i-1)*m+j,T,b[i][j]);
    130         }
    131     for(;bfs();)
    132       ans+=dinic(0,inf);
    133     printf("%d
    ",tot-(ans/2));
    134     return 0;
    135 }

    网络流最小割 建边非常神奇。

    S向i连变容量为文[i]+文[i][j]/2,向j连边容量为文[j]+文[i][j]/2。i向T连边容量为理[i]+理[i][j]/2,j向T连边容量为理[j]+理[i][j]/2;i于j连边,容量为文[i][j]/2+理[i][j]/2.

  • 相关阅读:
    MyEclipse优化设置(最详细版本)
    报错:java.net.bindexception: address already in use: jvm_bind:8080
    java.net.BindException: Address already in use: JVM_Bind
    MyEclipse总是quick update解决办法
    【EJB学习笔记】——EJB开发环境搭建(Eclipse集成JBoss)
    对EJB2.1几种接口的认识
    免安装PostgreSQL启动服务及创建数据库
    git使用教程5-pycharm修改代码后提交到代码仓库
    git使用教程4-pycharm拉取git仓库项目代码
    git使用教程3-解决github网页打开慢的问题
  • 原文地址:https://www.cnblogs.com/xydddd/p/5294035.html
Copyright © 2011-2022 走看看