Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. struct edge {
  9.     int to;
  10.     int capacity, flow;
  11.     int back_index;
  12.  
  13.     edge(int to, int c, int bi) : to(to), capacity(c), flow(0), back_index(bi) {};
  14.  
  15.     int residual() {
  16.         return capacity - flow;
  17.     }
  18.  
  19.     bool saturated() {
  20.         return flow == capacity;
  21.     }
  22. };
  23.  
  24. typedef vector<vector<edge>> graph;
  25.  
  26. graph g;
  27. vector<int> d;
  28. vector<int> p;
  29.  
  30. int s, t;
  31. long long limit;
  32.  
  33. bool bfs() {
  34.     d.assign(g.size(), g.size() + 1);
  35.     d[s] = 0;
  36.     queue<int> q;
  37.     q.push(s);
  38.  
  39.     while (!q.empty()) {
  40.         int v = q.front();
  41.         q.pop();
  42.         for (auto &u : g[v]) {
  43.             if (d[u.to] > d[v] + 1 && u.residual() >= limit) {
  44.                 d[u.to] = d[v] + 1;
  45.                 q.push(u.to);
  46.             }
  47.         }
  48.     }
  49.  
  50.     return d[t] != g.size() + 1;
  51. }
  52.  
  53. int dfs(int v, int flow) {
  54.     if (v == t || flow == 0) {
  55.         return flow;
  56.     }
  57.  
  58.     for (; p[v] < g[v].size(); p[v]++) {
  59.         auto &u = g[v][p[v]];
  60.         if (d[u.to] == d[v] + 1 && u.residual() >= limit) {
  61.             int delta = dfs(u.to, min(flow, u.residual()));
  62.             if (delta != 0) {
  63.                 u.flow += delta;
  64.                 g[u.to][u.back_index].flow -= delta;
  65.                 return delta;
  66.             }
  67.         }
  68.     }
  69.  
  70.     return 0;
  71. }
  72.  
  73. long long max_flow() {
  74.     long long flow = 0;
  75.  
  76.     for (limit = 1u << 30; limit > 0; limit >>= 1) {
  77.         while (bfs()) {
  78.             p.assign(g.size(), 0);
  79.             long long f = dfs(s, INT32_MAX);
  80.  
  81.             while (f != 0) {
  82.                 flow += f;
  83.                 f = dfs(s, INT32_MAX);
  84.             }
  85.         }
  86.     }
  87.  
  88.     return flow;
  89. }
  90.  
  91. int main() {
  92.     freopen("t.txt", "r", stdin);
  93.     freopen("planaritycheck.out", "w", stdout);
  94.  
  95.     ios_base::sync_with_stdio(false);
  96.     cin.tie(nullptr);
  97.     cout.tie(nullptr);
  98.  
  99.     unsigned int n, m;
  100.     cin >> n >> m;
  101.     g.assign(n + m + 2, {});
  102.     vector<pair<int, int>> data;
  103.     g.reserve(m);
  104.     for (int i = 1; i <= n; i++) {
  105.         g[0].emplace_back(i, 300, i - 1);
  106.     }
  107.     for (int i = 1; i <= m; i++) {
  108.         g[n + i].emplace_back(n + m + 1, 300, g[n + i].size());
  109.     }
  110.     for (int i = 1; i <= n; i++) {
  111.         int x;
  112.         cin >> x;
  113.         while (x != 0) {
  114.             g[i].emplace_back(x + n, 1, g[i].size());
  115.             g[x + n].emplace_back(i, 1, g[i].size() - 1);
  116.             data.emplace_back(make_pair(i, x));
  117.             cin >> x;
  118.         }
  119.     }
  120.     s = 0;
  121.     t = n + m;
  122.     cout << max_flow() << endl;
  123.     for (int i = 0; i < data.size(); i++) {
  124.         if (g[data[i].first][data[i].second].flow) {
  125.             cout << data[i].first << " " << data[i].second << endl;
  126.         }
  127.  
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement