BotByte

Ford Fulkerson Max Flow.cpp

Sep 5th, 2017
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. /* Ford Fulkerson - Maximum FLow */
  2. /* Author : M. A. Rafsan Mazumder */
  3.  
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. #define MAX 105
  9. vector<int> adj[MAX];
  10. bool vis[MAX];
  11. int parent[MAX];
  12. int rGraph[MAX][MAX];
  13. int max_flow = 0;
  14. int s, t, n, m;
  15.  
  16. void gen()
  17. {
  18.     for(int i=0; i<MAX; i++) adj[i].clear();
  19.     memset(vis, false, sizeof vis);
  20.     memset(parent, -1, sizeof parent);
  21.     max_flow = 0;
  22.     memset(rGraph, 0, sizeof rGraph);
  23. }
  24.  
  25. bool bfs()
  26. {
  27.     memset(vis, false, sizeof vis);
  28.     queue<int> Q;
  29.     Q.push(s);
  30.     vis[s] = true;
  31.  
  32.     while(!Q.empty()){
  33.         int u = Q.front();
  34.         Q.pop();
  35.         for(int i=0; i<adj[u].size(); i++){
  36.             int v = adj[u][i];
  37.             if(!vis[v] && rGraph[u][v] > 0){
  38.                 vis[v] = true;
  39.                 parent[v] = u;
  40.                 Q.push(v);
  41.             }
  42.         }
  43.     }
  44.     return (vis[t] == true);
  45. }
  46.  
  47. void ford_fulkerson()
  48. {
  49.     while(bfs()){
  50.         int path_flow = INT_MAX;
  51.         int u, v;
  52.         for(v=t; v!=s; v=parent[v]){
  53.             u = parent[v];
  54.             path_flow = min(path_flow, rGraph[u][v]);
  55.         }
  56.  
  57.         for(v=t; v!=s; v=parent[v]){
  58.             u = parent[v];
  59.             rGraph[u][v] -= path_flow;
  60.             rGraph[v][u] += path_flow;
  61.         }
  62.  
  63.         max_flow += path_flow;
  64.     }
  65. }
  66.  
  67. int main()
  68. {
  69.     //freopen("in.txt", "r", stdin);
  70.     int cases;
  71.     scanf("%d", &cases);
  72.     int caseno = 0;
  73.     while(cases--){
  74.         gen();
  75.         scanf("%d", &n);
  76.         scanf("%d %d %d", &s, &t, &m);
  77.         for(int i=1; i<=m; i++){
  78.             int u, v, c;
  79.             scanf("%d %d %d", &u, &v, &c);
  80.             adj[u].push_back(v);
  81.             adj[v].push_back(u);
  82.             rGraph[u][v] += c;
  83.             rGraph[v][u] += c;
  84.         }
  85.         ford_fulkerson();
  86.         printf("Case %d: %d\n", ++caseno, max_flow);
  87.     }
  88. }
Advertisement
Add Comment
Please, Sign In to add comment