最大フローアルゴリズムdinic

間違っ分あるので時間半を転送 - 「OIerの悲劇的な歴史」

考え

羅区P3376ネットワークの最大フロー

タイトル説明

その場合、ネットワーク図を与え、ソース及びシンクは、ネットワークは、その最大流量を求めます。

入出力フォーマット

入力フォーマット:

最初の行は、4つの正の整数であり、それぞれN、M、S、T、点の数が含まれ、エッジの数、数のソース、シンクポイント数が存在します。

次のMラインは、3つの正整数UI、VI、WIが含まVIに到達するエッジそこから私のUIの記事を表し、WIの右側(即ち、最大流量のWi側)

出力フォーマット:

ラインは、正の整数が含まれている、ネットワークの最大流量です。

サンプル入力と出力

入力サンプル#1:

  4 5 4 3
  4 2 30
  4 3 20
  2 3 20
  2 1 30
  1 3 40

出力サンプル#1:

  50

説明

制限時間:  1000msの、128M

データスケール: 

データの30%:N <= 10、M <= 25

N <= 200、M <= 1000:データの70%を

N <= 10000、M <= 100000:データの100%に

コード

#include<cstdio>
#include<cstring>
using namespace std;

const int inf = 0x3f3f3f;

int n, m, s, t, tot = -1, ans = 0;
int st[200001], dep[10001];
int min(int a, int b) { return a < b ? a : b; }
struct node
{
    int to, val, last;
}c[200001];
void add(int u, int v, int w)
{
    c[++tot].to = v;
    c[tot].val = w;
    c[tot].last = st[u];
    st[u] = tot;
}
bool bfs()
{
    int q[10001], l = 0, r = 1;
    memset(dep, 0, sizeof dep);
    dep[s] = 1;
    q[r] = s;
    while (l != r)
    {
        int head = q[++l];
        for (int i = st[head]; i != -1; i = c[i].last)
        {
            if (c[i].val > 0 && !dep[c[i].to])
            {
                dep[c[i].to] = dep[head] + 1;
                q[++r] = c[i].to;
            }
        }
    }
    if (!dep[t])
        return false;
    return true;
}
int dfs(int u, int k)
{
    if (u == t) return k;
    for (int i = st[u]; i != -1; i = c[i].last)
    {
        if ((dep[c[i].to] == dep[u] + 1) && c[i].val)
        {
            int p = dfs(c[i].to, min(c[i].val, k));
            if (p > 0)
            {
                c[i].val -= p;
                c[i ^ 1].val += p;
                return p;
            }
        }    
    }
    return 0;
}
void dinic()
{
    while (bfs())
        while (int p = dfs(s, inf))
            ans += p;
    return;
}
int main()
{
    memset(st, -1, sizeof st);
    scanf("%d%d%d%d", &n, &m, &s, &t);
    for (int i = 0; i < m; i++)
    {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        add(u, v, w);
        add(v, u, 0);
    }
    dinic();
    printf("%d\n", ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/featherZHY/p/11334055.html