Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cstdio>
  5. #include <string>
  6. #include <queue>
  7. #include <stack>
  8. #include <unordered_map>
  9. #include <unordered_set>
  10. #include <sstream>
  11. #include <math.h>
  12.  
  13. using namespace std;
  14.  
  15. int n, m, s, t, flow = 0;
  16. vector<unordered_map<int, pair<int, int>>> g;
  17. vector<bool> mark;
  18.  
  19. int dfs(int v, int d) {
  20.     if (mark[v])
  21.         return 0;
  22.     mark[v] = true;
  23.     if (v == t) {
  24.         return d;
  25.     }
  26.     for (int u = n - 1; u >= 0; u--) {
  27.         if (g[v][u].second > g[v][u].first) {
  28.             int res = dfs(u, 1);
  29.             if (res > 0) {
  30.                 g[v][u].first += 1;
  31.                 g[u][v].first -= 1;
  32.                 return 1;
  33.             }
  34.         }
  35.     }
  36.     return 0;
  37. }
  38.  
  39. bool path(int v) {
  40.     cout << v + 1 << ' ';
  41.     if (v == t) {
  42.         cout << endl;
  43.         return true;
  44.     }
  45.     for (int u = 0; u < n; u++) {
  46.         if (g[v][u].first > 0) {
  47.             g[v][u].first -= 1;
  48.             g[u][v].first += 1;
  49.             if (path(u)) {
  50.                 return true;
  51.             }
  52.         }
  53.     }
  54.     return false;
  55. }
  56.  
  57. int main() {
  58.     cin >> n >> m;
  59.     cin >> s >> t;
  60.     s--;
  61.     t--;
  62.     g.resize(n);
  63.     mark.resize(n);
  64.  
  65.     for (int i = 0; i < m; ++i) {
  66.         int u, v, c = 1;
  67.         cin >> u >> v;
  68.         u--;
  69.         v--;
  70.         g[u][v].second += c;
  71.         g[v][u].second = g[v][u].first = 0;
  72.     }
  73.  
  74.     while (true) {
  75.         fill(mark.begin(), mark.end(), false);
  76.         int delta = dfs(s, INT_MAX);
  77.         if (delta > 0) {
  78.             flow += delta;
  79.         } else {
  80.             break;
  81.         }
  82.         if (flow == 2) {
  83.             break;
  84.         }
  85.     }
  86.  
  87.     if (flow >= 2) {
  88.         cout << "YES" << endl;
  89.         path(s);
  90.         path(s);
  91.     } else {
  92.         cout << "NO";
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement