Advertisement
Al3XS0n

Flow

Sep 13th, 2020
2,021
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. bool BFS(const Graph& g, std::map<pair<int, int>, int>& net, int start, int finish, vector<int>& par) {
  2.     vector<bool> vis(g.getSize() + 1, false);
  3.     vector<int> nb;
  4.     std::queue<int> q;
  5.     q.push(start);
  6.     vis[start] = true;
  7.     par[start] = -1;
  8.     while (!q.empty()) {
  9.         int v = q.front();
  10.         q.pop();
  11.         nb = g.getNeighbours(v);
  12.         for (auto to : nb) {
  13.             if (!vis[to] && net[make_pair(v, to)] > 0) {
  14.                 q.push(to);
  15.                 par[to] = v;
  16.                 vis[to] = true;
  17.             }
  18.         }
  19.     }
  20.     return vis[finish];
  21. }
  22.  
  23. void FindDisjointPaths(const Graph& g, int s, int t) {
  24.     std::map<pair<int, int>, int> net;
  25.     vector<vector<int>> ans;
  26.     vector<pair<int, int>> allEdges = g.getAllEdges();
  27.     for (auto edge : allEdges) {
  28.         net[make_pair(edge.first, edge.second)]++;
  29.     }
  30.     vector<int> par(g.getSize() + 1, 0);
  31.     int maxFlow = 0;
  32.     while (BFS(g, net, s, t, par)) {
  33.         int pathFlow = INF;
  34.         vector<int> curPath;
  35.         int v = t;
  36.         while (v != s) {
  37.             int u = par[v];
  38.             pathFlow = std::min(pathFlow, net[make_pair(u, v)]);
  39.             v = u;
  40.         }
  41.         v = t;
  42.         curPath.push_back(t);
  43.         while (v != s) {
  44.             int u = par[v];
  45.             curPath.push_back(u);
  46.             net[make_pair(u, v)] -= pathFlow;
  47.             v = u;
  48.         }
  49.         std::reverse(curPath.begin(), curPath.end());
  50.         for (int i = 0; i < pathFlow; ++i) {
  51.             ans.push_back(curPath);
  52.         }
  53.         maxFlow += pathFlow;
  54.         if (maxFlow >= 2) {
  55.             break;
  56.         }
  57.     }
  58.     if (maxFlow < 2) {
  59.         std::cout << "NO";
  60.     } else {
  61.         std::cout << "YES\n";
  62.         for (int i = 0; i < 2; ++i) {
  63.             for (auto u : ans[i]) {
  64.                 std::cout << u << ' ';
  65.             }
  66.             std::cout << std::endl;
  67.         }
  68.     }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement