#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define REP(i, l, r) for (int i = l; i >= r; i--)
#define P puts("OK");
#define MAXN 50010
int n, m, first[MAXN], next[MAXN], N = -1, dis[MAXN], S, T;
struct tlist {int x, y, f;} a[MAXN];
queue<int> q;
inline int min(int a, int b) {return a<b ? a : b;}
inline void add(int x, int y, int t) {
a[++N].x = x, a[N].y = y, a[N].f = t, next[N] = first[x], first[x] = N;
a[++N].x = y, a[N].y = x, a[N].f = 0, next[N] = first[y], first[y] = N;
}
inline bool bfs() {
while (!q.empty()) q.pop();
memset(dis, -1, sizeof(dis));
dis[S] = 0;
q.push(S);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = first[x]; i != -1; i = next[i])
if ((dis[a[i].y] == -1) && a[i].f)
dis[a[i].y] = dis[a[i].x] + 1,
q.push(a[i].y);
}
return dis[T] == -1 ? 0 : 1;
}
inline int find(int x, int low) {
int temp, sum = 0;
if (x == T) return low;
for (int i = first[x]; (i != -1) && (low-sum) > 0; i = next[i])
if ((dis[a[i].y] == dis[a[i].x] + 1) && (a[i].f) && (temp = find(a[i].y, min(low-sum, a[i].f)))) {
a[i].f -= temp;
a[i^1].f += temp;
sum += temp;
}
return sum;
}
inline int dinic(int begin, int end) {
S = begin, T = end;
int ans = 0, temp;
while (bfs())
while (temp = find(S, 0x7fffffff))
ans += temp;
return ans;
}
int main() {
// freopen("zyq.in", "r", stdin);
while (scanf("%d%d", &m, &n)) {
cin >> m >> n;
memset(next, -1, sizeof(next));
memset(first, -1, sizeof(first));
int tx, ty, tt;
rep(i, 1, m) {
scanf("%d%d%d", &tx, &ty, &tt);
add(tx, ty, tt);
}
cout << dinic(1, n) << endl;
}
return 0;
}
kyeremal-最大流dinic算法模板-多路增广
最新推荐文章于 2020-08-11 13:50:25 发布