1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include<bits/stdc++.h> #define N 101 #define M 10001 #define INF 100000000000000000ll using namespace std;
typedef struct MF { struct edge { int v, nxt; long long cap, flow; } e[M];
int fir[N], cnt = 0;
int n, S, T; long long maxflow = 0; int dep[N], cur[N];
void init() { memset(fir, -1, sizeof fir); cnt = 0; }
void addedge(int u, int v, long long w) { e[cnt] = {v, fir[u], w, 0}; fir[u] = cnt++; e[cnt] = {u, fir[v], 0, 0}; fir[v] = cnt++; }
bool bfs() { queue<int> q; memset(dep, 0, sizeof(int) * (n + 1));
dep[S] = 1; q.push(S); while (q.size()) { int u = q.front(); q.pop(); for (int i = fir[u]; ~i; i = e[i].nxt) { int v = e[i].v; if ((!dep[v]) && (e[i].cap > e[i].flow)) { dep[v] = dep[u] + 1; q.push(v); } } } return dep[T]; }
long long dfs(int u, long long flow) { if ((u == T) || (!flow)) return flow;
long long ret = 0; for (int& i = cur[u]; ~i; i = e[i].nxt) { int v = e[i].v, d; if ((dep[v] == dep[u] + 1) && (d = dfs(v, min(flow - ret, e[i].cap - e[i].flow)))) { ret += d; e[i].flow += d; e[i ^ 1].flow -= d; if (ret == flow) return ret; } } return ret; }
void dinic() { while (bfs()) { memcpy(cur, fir, sizeof(int) * (n + 1)); maxflow += dfs(S, INF); } } } mf;
int main() { int T; scanf("%d", &T); while (T--) { int n, m, s, t; scanf("%d%d%d%d", &n, &m, &s, &t); mf network; network.init(); network.S = s; network.T = t; network.n = n;
for (int i = 0; i < m; i++) { int u, v; long long w; scanf("%d%d%lld", &u, &v, &w); network.addedge(u, v, w); }
network.dinic(); printf("%lld\n", network.maxflow); } return 0; }
|