ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【ACWing】2172. Dinic/ISAP求最大流

2021-04-28 11:58:22  阅读:192  来源: 互联网

标签:10000 cur idx int flow 2172 Dinic return ISAP


题目地址:

https://www.acwing.com/problem/content/2174/

给定一个包含 n n n个点 m m m条边的有向图,并给定每条边的容量,边的容量非负。图中可能存在重边和自环。求从点 S S S到点 T T T的最大流。

输入格式:
第一行包含四个整数 n , m , S , T n,m,S,T n,m,S,T。接下来 m m m行,每行三个整数 u , v , c u,v,c u,v,c,表示从点 u u u到点 v v v存在一条有向边,容量为 c c c。点的编号从 1 1 1到 n n n。

输出格式:
输出点 S S S到点 T T T的最大流。如果从点 S S S无法到达点 T T T则输出 0 0 0。

数据范围:
2 ≤ n ≤ 10000 2≤n≤10000 2≤n≤10000
1 ≤ m ≤ 100000 1≤m≤100000 1≤m≤100000
0 ≤ c ≤ 10000 0≤c≤10000 0≤c≤10000
S ≠ T S≠T S​=T

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

const int N = 10010, M = 200010, INF = 1e8;
int n, m, S, T;
int h[N], e[M], f[M], ne[M], idx;
int q[N], d[N], cur[N];

void add(int a, int b, int c) {
    e[idx] = b, ne[idx] = h[a], f[idx] = c, h[a] = idx++;
    e[idx] = a, ne[idx] = h[b], f[idx] = 0, h[b] = idx++;
}

bool bfs() {
    int hh = 0, tt = 0;
    memset(d, -1, sizeof d);
    q[tt++] = S, d[S] = 0, cur[S] = h[S];
    while (hh < tt) {
        int t = q[hh++];
        for (int i = h[t]; ~i; i = ne[i]) {
            int v = e[i];
            if (d[v] == -1 && f[i]) {
                d[v] = d[t] + 1;
                cur[v] = h[v];
                if (v == T) return true;

                q[tt++] = v;
            }
        }
    }
    
    return false;
}

int find(int u, int limit) {
    if (u == T) return limit;
    int flow = 0;
    for (int i = cur[u]; ~i && flow < limit; i = ne[i]) {
        cur[u] = i;
        int v = e[i];
        if (d[v] == d[u] + 1 && f[i]) {
            int t = find(v, min(f[i], limit - flow));
            if (!t) d[v] = -1;
            f[i] -= t, f[i ^ 1] += t, flow += t;
        }
    }

    return flow;
}

int dinic() {
    int r = 0, flow;
    while (bfs()) while (flow = find(S, INF)) r += flow;
    return r;
}

int main() {
    scanf("%d%d%d%d", &n, &m, &S, &T);
    memset(h, -1, sizeof h);
    while (m--) {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c);
    }
    
    printf("%d\n", dinic());

    return 0;
}

标签:10000,cur,idx,int,flow,2172,Dinic,return,ISAP
来源: https://blog.csdn.net/qq_46105170/article/details/116230357

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有