zoukankan      html  css  js  c++  java
  • UVA 820 --- POJ 1273 最大流

    找了好久这两个的区别。。。UVA820 WA了 好多次。不过以后就做模板了,可以求任意两点之间的最大流。

    UVA 是无向图,因此可能有重边,POJ 1273是有向图,而且是单源点求最大流,因此改模板的时候注意一下。

    而且我居然犯了更愚蠢的错误,以为重边的时候需要选最大的,正解应该是累加。。。。

     1 #include<stdio.h>
     2 #include<queue>
     3 #include<string.h>
     4 #define INF 999999
     5 using namespace std;
     6 int s,t,n,m;
     7 int map[407][407],flow[407][407];
     8 int p[407],a[407];
     9 int EK(int s,int t)
    10 {
    11     queue<int>q;
    12     int sum=0;
    13     memset(flow,0,sizeof(flow));
    14     while(1)
    15     {
    16         memset(a,0,sizeof(a));
    17         a[s]=INF;
    18         q.push(s);
    19         while(!q.empty())
    20         {
    21             int u=q.front();
    22             q.pop();
    23             for(int i=1; i<=m; i++)
    24             {
    25                 if(!a[i]&&flow[u][i]<map[u][i])
    26                 {
    27                     p[i]=u;
    28                     q.push(i);
    29                     a[i]=a[u]<map[u][i]-flow[u][i]?a[u]:map[u][i]-flow[u][i];
    30                 }
    31             }
    32         }
    33         if(!a[t])break;
    34         for(int i=t; i!=s; i=p[i])
    35         {
    36             flow[p[i]][i]+=a[t];
    37             flow[i][p[i]]-=a[t];
    38         }
    39         sum+=a[t];
    40     }
    41     return sum;
    42 }
    43 int main()
    44 {
    45     int cas=1;
    46     while(scanf("%d",&m),m)
    47     {
    48         scanf("%d%d%d",&s,&t,&n);
    49         memset(map,0,sizeof(map));
    50         int a,b,c;
    51         for(int i=0; i<n; i++)
    52         {
    53             scanf("%d%d%d",&a,&b,&c);
    54             map[a][b]+=c;
    55             map[b][a]=map[a][b];
    56         }
    57         int maxx=EK(s,t);
    58         printf("Network %d
    ",cas++);
    59         printf("The bandwidth is %d.
    
    ",maxx);
    60     }
    61     return 0;
    62 }
    UVA 820 直接EK模板上

    可与POJ 1273 的有向图比较一下

    注释掉了一个加边

    POJ 1273 样例来一发

    2 2

    1 2 3

    1 2 5             答案是8

    2 2

    1 2 3

    2 1 5             答案是3

  • 相关阅读:
    机房管理系统
    Red_Black_Tree C++
    Binary_Seach_Tree(BST) C++
    贪吃蛇小笔记
    转-Unix系统进程对SIGTERM、SIGUSR1和SIGUSR2信号处理
    My Dev Env
    mac gdb home-brew
    pub python
    ioctl siocgifhwaddr mac os x
    macbook与外接显示器
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4782095.html
Copyright © 2011-2022 走看看