tuki2501

FFLOW.cpp

Jul 23rd, 2020 (edited)
1,391
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 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], iter[N];
  11.  
  12. bool bfs(int lim) {
  13.   memset(level, 0, sizeof(level));
  14.   queue<int> q; q.push(src);
  15.   level[src] = 1;
  16.   while (q.size()) {
  17.     int u = q.front(); q.pop();
  18.     if (u == snk) return 1;
  19.     for (auto v : adj[u]) {
  20.       if (!level[v] && capa[u][v] - flow[u][v] >= lim) {
  21.         q.push(v);
  22.         level[v] = level[u] + 1;
  23.       }
  24.     }
  25.   }
  26.   return 0;
  27. }
  28.  
  29. bool dfs(int u, int lim) {
  30.   if (u == snk) return 1;
  31.   for (; iter[u] < adj[u].size(); iter[u]++) {
  32.     int v = adj[u][iter[u]];
  33.     if (level[v] == level[u] + 1) {
  34.       if (capa[u][v] - flow[u][v] >= lim) {
  35.         if (dfs(v, lim)) {
  36.           flow[u][v] += lim;
  37.           flow[v][u] -= lim;
  38.           return 1;
  39.         }
  40.       }
  41.     }
  42.   }
  43.   return 0;
  44. }
  45.  
  46. signed main() {
  47.   cin.tie(0)->sync_with_stdio(0);
  48.   cin >> n >> m;
  49.   src = 1; snk = n;
  50.   for (int i = 1; i <= m; i++) {
  51.     int u, v, w;
  52.     cin >> u >> v >> w;
  53.     adj[u].push_back(v);
  54.     adj[v].push_back(u);
  55.     capa[u][v] += w;
  56.     capa[v][u] += w;
  57.   }
  58.   int sum = 0, lim = (1LL << 60);
  59.   while (lim) {
  60.     if (!bfs(lim)) lim >>= 1;
  61.     else {
  62.       memset(iter, 0, sizeof(iter));
  63.       while (dfs(src, lim)) sum += lim;
  64.     }
  65.   }
  66.   cout << sum << '\n';
  67. }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment