Advertisement
Guest User

Ford-Fulkerson

a guest
May 29th, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. int ffDFS(int source, int sink, int flow, std::vector<Edge>& edges, std::vector<int>& head, std::vector<bool>& used) {
  2.     if (source == sink) {
  3.         return flow;
  4.     }
  5.     used[source] = true;
  6.     for (int i = head[source]; i != -1; i = edges[i].next) {
  7.         if (!used[edges[i].to] && (edges[i].flow < edges[i].capacity)) {
  8.             int pushed = ffDFS(edges[i].to, sink, std::min(flow, edges[i].capacity - edges[i].flow), edges, head, used);
  9.             if (pushed) {
  10.                 edges[i].flow += pushed;
  11.                 edges[i ^ 1].flow -= pushed;
  12.                 return pushed;
  13.             }
  14.         }
  15.     }
  16.     return 0;
  17. }
  18.  
  19. Graph flowFordFulkerson(int sourse, int sink) {
  20.     int n;
  21.     int r;
  22.     int w;
  23.     graph->getProperties(n, r, w);
  24.     Graph result(type, n, r, w);
  25.  
  26.     std::vector<Edge> edges;
  27.     std::vector<int> head(n + 1, -1);
  28.     std::vector<bool> used(n + 1, false);
  29.  
  30.     transformToListOfEdges();
  31.     for (auto& edge : graph->getListOfEdges()) {
  32.         int a;
  33.         int b;
  34.         int w;
  35.         std::tie(a, b, w) = edge;
  36.         edges.push_back(Edge{a, b, head[a], 0, w});
  37.         edges.push_back(Edge{b, a, head[b], 0, 0});
  38.         head[a] = edges.size() - 2;
  39.         head[b] = edges.size() - 1;
  40.     }
  41.  
  42.     for (;;) {
  43.         if (ffDFS(sourse, sink, std::numeric_limits<int>::max(), edges, head, used) == 0) {
  44.             break;
  45.         }
  46.         used.assign(n + 1, false);
  47.     }
  48.  
  49.     for (int i = 0; i < int(edges.size()); i += 2) {
  50.         result.addEdge(edges[i].from, edges[i].to, edges[i].flow);
  51.     }
  52.     return result;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement