Advertisement
he_obviously

Untitled

May 7th, 2022
1,206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. struct Edge {
  10.     int from, to;
  11.     long long cap, flow;
  12.     Edge() = default;
  13.     Edge(int a, int b, long long c, long long d) {
  14.         from = a;
  15.         to = b;
  16.         cap = c;
  17.         flow = d;
  18.     }
  19. };
  20.  
  21. long long INF = 1000000000;
  22. int m, n, k, l;
  23. vector<Edge> edges;
  24. vector<vector<int>> ind;
  25. vector<int> mount, pos;
  26. int A, B;
  27. vector<int> p, d;
  28.  
  29. bool bfs(long long k_) {
  30.     fill(d.begin(), d.end(), -1);
  31.     queue<int> q;
  32.     d[A] = 0;
  33.     q.push(A);
  34.     while(!q.empty()) {
  35.         int v = q.front();
  36.         q.pop();
  37.         for (int i : ind[v]) {
  38.             int to = edges[i].to;
  39.             if (edges[i].cap - edges[i].flow < k_) {
  40.                 continue;
  41.             }
  42.             if (d[to] == -1) {
  43.                 d[to] = d[v] + 1;
  44.                 q.push(to);
  45.             }
  46.         }
  47.     }
  48.     return d[B] != -1;
  49. }
  50.  
  51. long long dfs(int i, long long flow, long long k_){
  52.     if(i == B){
  53.         return flow;
  54.     }
  55.     for( ; p[i] < ind[i].size(); ++p[i]){
  56.         int id = ind[i][p[i]];
  57.         int to = edges[id].to;
  58.         if (edges[id].cap - edges[id].flow < k_) {
  59.             continue;
  60.         }
  61.         if(d[to] == d[i] + 1) {
  62.             long long delta = dfs(to, min(flow, edges[id].cap - edges[id].flow), k_);
  63.             if(delta > 0){
  64.                 edges[id].flow += delta;
  65.                 edges[id ^ 1].flow -= delta;
  66.                 return delta;
  67.             }
  68.         }
  69.     }
  70.     return 0;
  71. }
  72.  
  73. void dfs2(int i, vector<int>& used) {
  74.     used[i] = 1;
  75.     for (int j : ind[i]) {
  76.         if (edges[j].cap - edges[j].flow > 0 && !used[edges[j].to]) {
  77.             dfs2(edges[j].to, used);
  78.         }
  79.     }
  80. }
  81.  
  82. int main() {
  83.  
  84.     cin >> m >> n >> k >> l;
  85.  
  86.     ind.resize(m * n * 2);
  87.     p.resize(m * n * 2);
  88.     d.resize(m * n * 2);
  89.  
  90.     for (int i = 0; i < k; ++i) {
  91.         int x, y;
  92.         cin >> x >> y;
  93.         --x; --y;
  94.         mount.push_back(x * n + y);
  95.     }
  96.  
  97.     for (int i = 0; i < l; ++i) {
  98.         int x, y;
  99.         cin >> x >> y;
  100.         --x; --y;
  101.         pos.push_back(x * n + y);
  102.     }
  103.  
  104.     {
  105.         int x, y;
  106.         cin >> x >> y;
  107.         --x; --y;
  108.         A = x * n + y;
  109.         cin >> x >> y;
  110.         --x; --y;
  111.         B = x * n + y;
  112.     }
  113.  
  114.     for (int i = 0; i < m; ++i) {
  115.         for (int j = 0; j < n; ++j) {
  116.             int num = i * n + j;
  117.             if (find(mount.begin(), mount.end(), num) != mount.end()) {
  118.                 edges.emplace_back(num, num + n * m, 0, 0);
  119.                 ind[num].push_back(edges.size() - 1);
  120.                 edges.emplace_back(num + n * m, num, 0, 0);
  121.                 ind[num + n * m].push_back(edges.size() - 1);
  122.             } else if (find(pos.begin(), pos.end(), num) != pos.end()) {
  123.                 edges.emplace_back(num, num + n * m, 1, 0);
  124.                 ind[num].push_back(edges.size() - 1);
  125.                 edges.emplace_back(num + n * m, num, 0, 0);
  126.                 ind[num + n * m].push_back(edges.size() - 1);
  127.             } else {
  128.                 edges.emplace_back(num, num + n * m, INF, 0);
  129.                 ind[num].push_back(edges.size() - 1);
  130.                 edges.emplace_back(num + n * m, num, 0, 0);
  131.                 ind[num + n * m].push_back(edges.size() - 1);
  132.             }
  133.             if (i > 0) {
  134.                 int num_to = (i - 1) * n + j;
  135.                 edges.emplace_back(num + n * m, num_to, INF, 0);
  136.                 ind[num + n * m].push_back(edges.size() - 1);
  137.                 edges.emplace_back(num_to, num + n * m, 0, 0);
  138.                 ind[num_to].push_back(edges.size() - 1);
  139.             }
  140.             if (j > 0) {
  141.                 int num_to = i * n + (j - 1);
  142.                 edges.emplace_back(num + n * m, num_to, INF, 0);
  143.                 ind[num + n * m].push_back(edges.size() - 1);
  144.                 edges.emplace_back(num_to, num + n * m, 0, 0);
  145.                 ind[num_to].push_back(edges.size() - 1);
  146.             }
  147.             if (i < m - 1) {
  148.                 int num_to = (i + 1) * n + j;
  149.                 edges.emplace_back(num + n * m, num_to, INF, 0);
  150.                 ind[num + n * m].push_back(edges.size() - 1);
  151.                 edges.emplace_back(num_to, num + n * m, 0, 0);
  152.                 ind[num_to].push_back(edges.size() - 1);
  153.             }
  154.             if (j < n - 1) {
  155.                 int num_to = i * n + (j + 1);
  156.                 edges.emplace_back(num + n * m, num_to, INF, 0);
  157.                 ind[num + n * m].push_back(edges.size() - 1);
  158.                 edges.emplace_back(num_to, num + n * m, 0, 0);
  159.                 ind[num_to].push_back(edges.size() - 1);
  160.             }
  161.         }
  162.     }
  163.  
  164.     long long ans = 0;
  165.     for (int k_ = 30; k_ >= 0; --k_) {
  166.         while (bfs(1LL << k_)) {
  167.             fill(p.begin(), p.end(), 0);
  168.             long long flow = dfs(A, INF, 1LL << k_);
  169.             while (flow != 0) {
  170.                 ans += flow;
  171.                 flow = dfs(A, INF, 1LL << k_);
  172.             }
  173.         }
  174.     }
  175.  
  176.     if (ans >= INF) {
  177.         cout << -1;
  178.         return 0;
  179.     }
  180.  
  181.     cout << ans << "\n";
  182.  
  183.     set<pair<int, int>> res;
  184.     vector<int> used(m * n * 2, 0);
  185.     dfs2(A, used);
  186.     for (auto e : edges) {
  187.         if (used[e.from] != used[e.to] && find(pos.begin(), pos.end(), min(e.from, e.to)) != pos.end()) {
  188.             res.insert({min(e.from, e.to) / n + 1, min(e.from, e.to) % n + 1});
  189.         }
  190.     }
  191.  
  192.     for (auto p_ : res) {
  193.         cout << p_.first << " " << p_.second << "\n";
  194.     }
  195.  
  196.     return 0;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement