zoukankan      html  css  js  c++  java
  • 网络流——增广路算法(dinic)模板 [BeiJing2006]狼抓兔子

     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<cstdio>
     6 #include<queue>
     7 using namespace std;
     8 struct data
     9 {
    10     int from,to,next,cup;
    11     data(){from=-1,to=-1,next=-1,cup=-1;}
    12 }e[6000001];
    13 int cnt=0,head[1000001];
    14 int dis[1000001];
    15 bool vis[1000001];
    16 void add(int u,int v,int w)
    17 {e[cnt].from=u,e[cnt].to=v,e[cnt].next=head[u],head[u]=cnt,e[cnt].cup=w;cnt++;}
    18 int s,t;
    19 bool bfs()
    20 {
    21     memset(dis,-1,sizeof(dis));
    22     int f=2147483647;
    23     queue<int> q;
    24     q.push(s);
    25     dis[s]=0;
    26     while(!q.empty())
    27     {
    28         int n=q.front();
    29         q.pop();
    30         for(int i=head[n];i>=0;i=e[i].next)
    31         {
    32             if(dis[e[i].to]==-1&&e[i].cup>0)
    33             {
    34                 dis[e[i].to]=dis[n]+1;
    35                 q.push(e[i].to);
    36             }
    37         }
    38     }
    39     return dis[t]!=-1;
    40 }
    41 int dfs(int n,int a)
    42 {
    43     
    44     if(n==t||a==0) return a;
    45     int flow=0,f;
    46     for(int i=head[n];i>=0;i=e[i].next)
    47     {
    48         if(dis[e[i].to]==dis[n]+1&&e[i].cup>0)
    49         {
    50             f=dfs(e[i].to,min(a,e[i].cup));
    51             e[i].cup-=f;
    52             e[i^1].cup+=f;
    53             flow+=f;
    54             a-=f;
    55             if(a==0) break;
    56         }
    57     }
    58     if(!flow) dis[n]=-1;
    59     return flow;
    60 }
    61 int dinic()
    62 {
    63     int sum=0;
    64     while(bfs()) sum+=dfs(s,2147483647);
    65     return sum;
    66 }
    67 int main()
    68 {
    69     memset(head,-1,sizeof(head));
    70     int n,m;
    71     scanf("%d%d",&n,&m);
    72     int x;
    73     for(int i=1;i<=n;i++)
    74         for(int j=1;j<m;j++)
    75         {
    76             scanf("%d",&x);
    77             add(m*(i-1)+j,m*(i-1)+j+1,x);
    78             add(m*(i-1)+j+1,m*(i-1)+j,x);
    79         }
    80     for(int i=1;i<n;i++)
    81         for(int j=1;j<=m;j++)
    82         {
    83             scanf("%d",&x);
    84             add(m*(i-1)+j,m*(i)+j,x);
    85             add(m*(i)+j,m*(i-1)+j,x);
    86         }
    87     for(int i=1;i<n;i++)
    88         for(int j=1;j<m;j++)
    89         {
    90             scanf("%d",&x);
    91             add(m*(i-1)+j,m*(i)+j+1,x);
    92             add(m*(i)+j+1,m*(i-1)+j,x);
    93         }
    94     s=1,t=m*n;
    95     printf("%d
    ",dinic());
    96 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    javascript 判断电话号码的格式
    JavaScript 'Pig latin is cool'==>'igPay atinlay siay oolcay'
    JavaScript 找出特殊数字如135 = 1^1 + 3^2 + 5^3
    nginx+Apache实现动静分离
    MYSQL数据库的主从复制
    Connection could not be established with host smtp.163.com [Connection timed out #110]
    Yii2 的 redis 应用
    Yii2 模块名、控制器名、方法名
    讯搜
    支付宝异步通知时间点分布
  • 原文地址:https://www.cnblogs.com/wls001/p/5596042.html
Copyright © 2011-2022 走看看