zoukankan      html  css  js  c++  java
  • poj 1273

    网络流之最大流的基础题;

    可以使用dinic算法和EK算法:

    分别对着模板敲了一遍:

    dinic:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<queue>
     5 #define maxn 205
     6 #define inf 0xfffffff
     7 using namespace std;
     8 
     9 int map[maxn][maxn],level[maxn];
    10 int n,m;
    11 
    12 int bfs(int s)
    13 {
    14     memset(level,0,sizeof level);
    15     queue<int>q;
    16     q.push(s);
    17     level[s]=1;
    18     while(!q.empty())
    19     {
    20         int now=q.front();
    21         q.pop();
    22         for(int i=1; i<=m; i++)
    23             if(!level[i]&&map[now][i]>0)
    24             {
    25                 level[i]=level[now]+1;
    26                 q.push(i);
    27             }
    28     }
    29     return level[m]!=0;
    30 }
    31 
    32 int dfs(int s,int cp)
    33 {
    34     int tmp=cp,t;
    35     if(s==m) return cp;
    36     for(int i=1; i<=m&&tmp; i++)
    37         if(level[i]==level[s]+1&&map[s][i]>0)
    38         {
    39             t=dfs(i,min(tmp,map[s][i]));
    40             map[s][i]-=t;
    41             map[i][s]+=t;
    42             tmp-=t;
    43         }
    44     return cp-tmp;
    45 }
    46 
    47 int main()
    48 {
    49     int a,b,f;
    50     while(scanf("%d%d",&n,&m)!=EOF)
    51     {
    52         memset(map,0,sizeof map);
    53         for(int i=0; i<n; i++)
    54         {
    55             scanf("%d%d%d",&a,&b,&f);
    56             map[a][b]+=f;
    57         }
    58         int ans=0,flow=0;
    59         while(bfs(1))
    60         {
    61             while(flow=dfs(1,inf))
    62                 ans+=flow;
    63         }
    64         printf("%d
    ",ans);
    65     }
    66     return 0;
    67 }
    View Code

    EK:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define maxn 205
     5 #include<queue>
     6 using namespace std;
     7 
     8 int map[maxn][maxn],p[maxn],n,m;
     9 bool flag[maxn];
    10 bool bfs()
    11 {
    12     queue<int>q;
    13     memset(flag,0,sizeof flag);
    14     memset(p,-1,sizeof p);
    15     q.push(1);
    16     flag[1]=1;
    17     while(!q.empty())
    18     {
    19         int now=q.front();
    20         q.pop();
    21         if(now==m) return 1;
    22         for(int i=1; i<=m; i++)
    23             if(map[now][i]>0&&!flag[i])
    24             {
    25                 flag[i]=1;
    26                 p[i]=now;
    27                 q.push(i);
    28             }
    29     }
    30     return 0;
    31 }
    32 
    33 void ek()
    34 {
    35     int u,flow=0,t;
    36     while(bfs())
    37     {
    38         t=99999999;
    39         u=m;
    40         while(p[u]!=-1)
    41         {
    42             t=min(t,map[p[u]][u]);
    43             u=p[u];
    44         }
    45         flow+=t;
    46         u=m;
    47         while(p[u]!=-1)
    48         {
    49             map[p[u]][u]-=t;
    50             map[u][p[u]]+=t;
    51             u=p[u];
    52         }
    53     }
    54     printf("%d
    ",flow);
    55 }
    56 
    57 int main()
    58 {
    59     int a,b,f;
    60     while(scanf("%d%d",&n,&m)!=EOF)
    61     {
    62         memset(map,0,sizeof map);
    63         while(n--)
    64         {
    65             scanf("%d%d%d",&a,&b,&f);
    66             map[a][b]+=f;
    67         }
    68         ek();
    69     }
    70     return 0;
    71 }
    View Code
  • 相关阅读:
    fatal: 'origin' does not appear to be a git repository
    Mac cpu过高问题分析及解决
    Java8新特性之日期和时间
    Allure自动化测试报告之修改allure测试报告logo
    Allure自动化测试报告之修改allure测试报告名称
    jmeter压测过程中报java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
    java.security.InvalidKeyException: Illegal key size or default parameters
    scanf中的%[^ ]%*c格式
    fork,vfork和clone底层实现
    僵尸进程的产生原因和避免方法
  • 原文地址:https://www.cnblogs.com/yours1103/p/3316830.html
Copyright © 2011-2022 走看看