Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* in the name of ALLAH, most gracious, most merciful */
- #include <stdio.h>
- #include <string.h>
- #include <limits.h>
- #include <algorithm>
- const int MAX_N = int (1e2) + 7;
- const int MAX_E = int (1e4) + 7;
- int n, e, c;
- int src, sink, last [MAX_N], gap [MAX_N], h [MAX_N];
- int to [MAX_E], from [MAX_E], flow [MAX_E];
- inline void add (int u, int v, int c) {
- to [e] = v, from [e] = last [u], last [u] = e, flow [e++] = c;
- to [e] = u, from [e] = last [v], last [v] = e, flow [e++] = c;
- }
- int isap_dfs (int u, int exp) {
- if (u == sink) return exp;
- for (int e = last [u]; ~e; e = from [e]) {
- int v = to [e];
- if (flow [e] > 0 && h [v] + 1 == h [u]) {
- int c = isap_dfs (v, std::min (exp, flow [e]));
- flow [e] -= c;
- flow [e ^ 1] += c;
- if (c > 0) return c;
- }
- }
- if (--gap [h [u]] == 0) h [src] = n;
- ++gap [++h [u]];
- return 0;
- }
- // nodes are 1 indexed, edges should be added normally for general version
- int isap_flow () {
- int ret = 0;
- gap [0] = n;
- while (h [src] < n) ret += isap_dfs (src, INT_MAX);
- return ret;
- }
- void init () {
- e = 0;
- memset (gap, 0, sizeof gap);
- memset (h, 0, sizeof h);
- memset (last, -1, sizeof last);
- }
- int main () {
- #ifdef Local
- freopen ("input.txt", "r", stdin);
- // freopen ("output.txt", "w", stdout);
- #endif
- int t;
- scanf ("%d", &t);
- for (int cs = 1; cs <= t; ++cs) {
- scanf ("%d %d %d %d", &n, &src, &sink, &c);
- init ();
- for (int i = 0; i < c; ++i) {
- int u, v, w;
- scanf ("%d %d %d", &u, &v, &w);
- add (u, v, w);
- }
- printf ("Case %d: %d\n", cs, isap_flow ());
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment