Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define int long long
  5. const int N = 1e6;
  6.  
  7. struct Edge{
  8.     int dst, f, c;
  9. };
  10.  
  11.  
  12. vector <Edge> e;
  13. int s = 1, n;
  14. //e1, e1
  15. //(e[i])' = e[i ^ 1]
  16. vector <int> g[N];
  17. bool used[N];
  18. //g[i] - список ребер исходящих из v
  19.  
  20. int dfs(int v, int minn) {
  21.     //cout << v << endl;
  22.     if (used[v]) return 0;
  23.     used[v] = true;
  24.     if (v == n) return minn;
  25.     for (auto i : g[v]) {
  26.  
  27.         if (e[i].f == e[i].c) continue;
  28.         int delta = dfs(e[i].dst, min(minn, e[i].c - e[i].f));
  29.         if (delta > 0) {
  30.             e[i].f += delta;
  31.             e[(i ^ 1)].f -= delta;
  32.             return delta;
  33.         }
  34.     }
  35.     return 0;
  36. }
  37. signed main() {
  38.     int m;
  39.     cin >> n >> m;
  40.     for (int i = 0; i < m * 2; i+= 2) {
  41.         Edge kek, kek1;
  42.         int l, r, c;
  43.         cin >> l >> r >> c;
  44.         g[l].push_back(i);
  45.         g[r].push_back(i + 1);
  46.         kek.f = 0; kek.dst = r;
  47.         e.push_back({r, 0, c});
  48.         e.push_back({l, 0, c});
  49.     }
  50.     int F = 0;
  51.     while (true) {
  52.         fill(used, used + n + 5, false);
  53.         int delta = dfs(s, INT_MAX);
  54.         if (delta == 0) {
  55.             break;
  56.         }
  57.         F += delta;
  58.     }
  59.     vector <int> ans;
  60.     set <pair <int, int>> s;
  61.     for (int i = 1; i <= n; i++)  {
  62.         for (auto to : g[i]) {
  63.             int j = e[to].dst;
  64.             if (abs(e[to].f) == e[to].c && s.find({i, j}) == s.end() && used[i] != used[j]) {
  65.                     //cout << e[to].f << ' ' << e[to].c << endl;
  66.                 s.insert({i, j}); s.insert({j, i});
  67.                 ans.push_back(to / 2);
  68.             }
  69.         }
  70.     }
  71.     cout << ans.size() << ' ' << F << "\n";
  72.     for (auto to : ans) cout << to + 1 << ' ';
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement