Advertisement
double_trouble

maxflow modify

Apr 9th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 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.  
  11. using namespace std;
  12.  
  13. const int inf = 2000000007;
  14.  
  15. struct edge
  16. {
  17.     int to, from, cap, f;
  18. };
  19.  
  20.  
  21. vector<edge> E;
  22. vector<vector<int> > g;
  23. int S, I;
  24. int used[10010], d[10100], pt[10010], t[10100];
  25.  
  26. void add_edge(int from, int to, int cap)
  27. {
  28.     edge e;
  29.     e.to = to;
  30.     e.from = from;
  31.     e.cap = cap;
  32.     e.f = 0;
  33.     g[from].push_back(E.size());
  34.     E.push_back(e);
  35.     return;
  36. }
  37.  
  38. void bfs()
  39. {
  40.     queue<int> q;
  41.     d[I] = 0;
  42.     q.push(I);
  43.     used[I] = 1;
  44.     while (!q.empty())
  45.     {
  46.         int v = q.front();
  47.         q.pop();
  48.         for (int i = 0; i < g[v].size(); i++)
  49.         {
  50.             int r = g[v][i];
  51.             int to = E[r].to;
  52.             if (!used[to] && E[r].cap > E[r].f)
  53.             {
  54.                 q.push(to);
  55.                 d[to] = d[v] + 1;
  56.                 used[to] = 1;
  57.             }
  58.         }
  59.     }
  60.     return;
  61. }
  62.  
  63. int dfs(int v, int flow = inf)
  64. {
  65.     if (flow == 0)
  66.         return 0;
  67.  
  68.     if (v == S)
  69.         return flow;
  70.  
  71.     int save = 0;
  72.     for (; pt[v] < g[v].size(); pt[v]++)
  73.     {
  74.         int i = pt[v];
  75.         int r = g[v][i];
  76.         int to = E[r].to;
  77.         if (d[to] != d[v] + 1)
  78.             continue;
  79.         int del = E[r].cap - E[r].f;
  80.         int k = dfs(to, min(flow, del));
  81.         if (k >= 0)
  82.         {
  83.             if (k > flow)
  84.                 k = flow;
  85.  
  86.             flow -= k;
  87.             save += k;
  88.             E[r].f += k;
  89.             E[r ^ 1].f -= k;
  90.             if (flow == 0)
  91.                 return save;
  92.         }
  93.     }
  94.     return save;
  95. }
  96.  
  97. int main()
  98. {
  99.     ios_base::sync_with_stdio(0);
  100.     cin.tie(0);
  101.     cout.tie(0);
  102.  
  103.     int n;
  104.     cin >> n;
  105.     int x, y;
  106.     for (int i = 0; i < n; i++)
  107.         cin >> x >> y;
  108.     g.resize(n);
  109.     int m;
  110.     cin >> m;
  111.     int v, u, cap;
  112.     I = 0;
  113.     S = n - 1;
  114.     for (int i = 0; i < m; i++)
  115.     {
  116.         cin >> v >> u >> cap;
  117.         v--;
  118.         u--;
  119.         add_edge(v, u, cap);
  120.         add_edge(u, v, 0);
  121.         add_edge(u, v, cap);
  122.         add_edge(v, u, 0);
  123.     }
  124.  
  125.     int f = 0;
  126.     int ans = 0;
  127.     while (1)
  128.     {
  129.         for (int i = 0; i < n; i++)
  130.         {
  131.             d[i] = 0;
  132.             used[i] = 0;
  133.             pt[i] = 0;
  134.         }
  135.  
  136.         bfs();
  137.  
  138.         if (d[S] == 0)
  139.             break;
  140.  
  141.         f = dfs(I);
  142.         if (f > 0)
  143.             ans += f;
  144.     }
  145.  
  146.     cout << ans << endl;
  147.  
  148.     for (int i = 0; i < E.size(); i += 4)
  149.     {
  150.         if (E[i].f > E[i + 2].f)
  151.             printf("%d %d %d\n", E[i].from + 1, E[i].to + 1, E[i].f - E[i + 2].f);
  152.         //cout << E[i].from + 1 << " " << E[i].to + 1 << " " << E[i].f - E[i+2].f << endl;
  153.         else
  154.             printf("%d %d %d\n", E[i].to + 1, E[i].from + 1, E[i + 2].f - E[i].f);
  155.             //cout << E[i].to + 1 << " " << E[i].from + 1 << " " << E[i+2].f - E[i].f << endl;
  156.     }
  157.  
  158.     system("PAUSE");
  159.  
  160.     return 0;
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement