tuki2501

NKFLOW.cpp

Oct 3rd, 2020 (edited)
1,366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5.  
  6. const int N = 5005;
  7.  
  8. int n, m, src, snk;
  9. vector<int> adj[N];
  10. int capa[N][N], flow[N][N], level[N];
  11.  
  12. void bfs() {
  13.   fill(level, level + N, 0);
  14.   queue<int> q; q.push(src);
  15.   level[src] = 1;
  16.   while (q.size()) {
  17.     int u = q.front(); q.pop();
  18.     for (auto v : adj[u]) {
  19.       if (!level[v] && capa[u][v] - flow[u][v] > 0) {
  20.         q.push(v);
  21.         level[v] = level[u] + 1;
  22.       }
  23.     }
  24.   }
  25. }
  26.  
  27. int dfs(int u, int lim) {
  28.   if (u == snk) return lim;
  29.   for (auto v : adj[u]) {
  30.     if (level[v] > level[u]) {
  31.       if (capa[u][v] - flow[u][v] > 0) {
  32.         int f = dfs(v, min(lim, capa[u][v] - flow[u][v]));
  33.         if (f > 0) {
  34.           flow[u][v] += f;
  35.           flow[v][u] -= f;
  36.           return f;
  37.         }
  38.       }
  39.     }
  40.   }
  41.   return 0;
  42. }
  43.  
  44. signed main() {
  45.   ios::sync_with_stdio(0); cin.tie(0);
  46.   cin >> n >> m >> src >> snk;
  47.   for (int i = 1; i <= m; i++) {
  48.     int u, v, w;
  49.     cin >> u >> v >> w;
  50.     adj[u].push_back(v);
  51.     adj[v].push_back(u);
  52.     capa[u][v] += w;
  53.     // capa[v][u] += w;
  54.   }
  55.   int sum = 0;
  56.   while (1) {
  57.     bfs();
  58.     if (!level[snk]) break;
  59.     for (int f; (f = dfs(src, LLONG_MAX)) > 0; ) sum += f;
  60.   }
  61.   cout << sum << '\n';
  62. }
Add Comment
Please, Sign In to add comment