zoukankan      html  css  js  c++  java
  • hihocoder1378 网络流二·最大流最小割定理

    思路:

    在输出最大流的流量的基础上再输出最终残余网络中从源点可达的点即可。使用了EK算法。

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int INF = 0x3f3f3f3f;
     5 const int N = 505;
     6 
     7 int n, m;
     8 int G[N][N], pre[N];
     9 bool vis[N];
    10 
    11 int augment(int s, int t)
    12 {
    13     queue<int> q;
    14     q.push(s);
    15     memset(pre, 0, sizeof(pre));
    16     memset(vis, 0, sizeof(vis));
    17     vis[s] = true;
    18     bool flg = false;
    19     while (!q.empty())
    20     {
    21         int tmp = q.front(); q.pop();
    22         for (int i = 1; i <= n; i++)
    23         {
    24             if (G[tmp][i] && !vis[i])
    25             {
    26                 pre[i] = tmp;
    27                 vis[i] = true;
    28                 if (i == t) { flg = true; break; }
    29                 else q.push(i);
    30             }
    31         }
    32         if (flg) break;
    33     }
    34     if (!flg) return 0;
    35     int now = t;
    36     int minn = INF;
    37     while (pre[now])
    38     {
    39         minn = min(minn, G[pre[now]][now]);
    40         now = pre[now];
    41     }
    42     now = t;
    43     while (pre[now])
    44     {
    45         G[pre[now]][now] -= minn;
    46         G[now][pre[now]] += minn;
    47         now = pre[now];
    48     }
    49     return minn;
    50 }
    51 int main()
    52 {
    53     while (cin >> n >> m)
    54     {
    55         memset(G, 0, sizeof(G));
    56         int a, b, c;
    57         for (int i = 0; i < m; i++)
    58         {
    59             cin >> a >> b >> c;
    60             G[a][b] += c;
    61         }
    62         int ans = 0;
    63         int res = augment(1, n);
    64         while (res)
    65         {
    66             ans += res;
    67             res = augment(1, n);
    68         }
    69         cout << ans << " ";
    70         int cnt = 0;
    71         for (int i = 1; i <= n; i++)
    72         {
    73             if (vis[i]) cnt++;
    74         }
    75         cout << cnt << endl;
    76         for (int i = 1; i <= n; i++)
    77         {
    78             if (vis[i]) cout << i << " ";
    79         }
    80         cout << endl;
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    webpack打包报错configuration has an unknown property 'mode'
    CSP 201712-4 行车路线(最短路)
    设计模式
    sqlserver 迁移数据
    DataX
    Python 对接WebService
    IOS APP打包流程
    nginxUI
    ROS脚本-下线时判断在线数量进行重拨号
    bash 字符串截取的8种方法
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9878018.html
Copyright © 2011-2022 走看看