Advertisement
double_trouble

Edmonds Karp's algorythm

Apr 21st, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <string>
  5. #include <cstring>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <set>
  9. #include <queue>
  10. #include <map>
  11.  
  12. using namespace std;
  13.  
  14. struct edge
  15. {
  16.     long long cap, f;
  17.     long long from, to;
  18. };
  19.  
  20. const long long inf = 2000000007;
  21.  
  22. vector<edge> E;
  23. vector<vector<long long> > g;
  24. long long used[200];
  25.  
  26. void add_edge(long long from, long long to, long long cap)
  27. {
  28.     edge e;
  29.     e.cap = cap;
  30.     e.from = from;
  31.     e.to = to;
  32.     e.f = 0;
  33.     g[from].push_back(E.size());
  34.     E.push_back(e);
  35.     //return;
  36. }
  37.  
  38. long long bfs(long long S, long long T, long long n)
  39. {
  40.     vector<long long> flow(n, inf);
  41.     queue<long long>q;
  42.     vector<long long> p(n, -1);
  43.     q.push(S);
  44.     used[S] = 1;
  45.     flow[S] = inf;
  46.     while (!q.empty())
  47.     {
  48.         long long v = q.front();
  49.         q.pop();
  50.         for (long long i = 0; i < g[v].size(); i++)
  51.         {
  52.             long long r = g[v][i];
  53.             long long to = E[r].to;
  54.             if (/*!used[to]*/ p[to] == -1 && E[r].cap > E[r].f)
  55.             {
  56.                 //used[v] = 1;
  57.                 p[to] = r;
  58.                 flow[to] = min(E[r].cap - E[r].f, flow[v]);
  59.                 q.push(to);
  60.             }
  61.         }
  62.     }
  63.  
  64.     //if (!used[T])
  65.     if (p[T] == -1)
  66.         return 0;
  67.  
  68.     long long f = flow[T];
  69.     for (long long v = T; v != S; v = E[p[v]].from)
  70.     {
  71.         long long r = p[v];
  72.         E[r].f += f;
  73.         E[r ^ 1].f -= f;
  74.     }
  75.     return f;
  76. }
  77.  
  78. int main()
  79. {
  80.  
  81.     long long n, k;
  82.     cin >> n >> k;
  83.     long long x, y, c;
  84.     g.resize(n);
  85.     for (long long i = 0; i < k; i++)
  86.     {
  87.         cin >> x >> y >> c;
  88.         x--;
  89.         y--;
  90.         add_edge(x, y, c);
  91.         add_edge(y, x, 0);
  92.         add_edge(y, x, c);
  93.         add_edge(x, y, 0);
  94.     }
  95.  
  96.  
  97.     long long ans = 0;
  98.  
  99.     while (1)
  100.     {
  101.         fill(used, used + n, 0);
  102.         long long f = bfs(0, n - 1, n);
  103.         if (f <= 0)
  104.             break;
  105.         ans += f;
  106.     }
  107.  
  108.     cout << ans << endl;
  109.  
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement