BotByte

Edmonds-Karp.cpp

May 3rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.39 KB | None | 0 0
  1. /*
  2.     Author : M. A. Rafsan Mazumder
  3.     Algorithm : Edmonds-Karp Algorithm for Maximum Flow
  4.     Complexity : V*E^2
  5.     Problem : LightOJ - 1153
  6. */
  7.  
  8. #include <bits/stdc++.h>
  9.  
  10. using namespace std;
  11.  
  12. #define MAX 105
  13. vector<int> adj[MAX];
  14. bool vis[MAX];
  15. int parent[MAX];
  16. int rGraph[MAX][MAX];
  17. int S, T;
  18.  
  19. void addedge(int u, int v, int cap)
  20. {
  21.     adj[u].push_back(v);
  22.     adj[v].push_back(u);
  23.     rGraph[u][v] += cap;
  24.     rGraph[v][u] += cap; // As Bidirectional, if unidirectional rGraph[v][u] = 0
  25. }
  26.  
  27.  
  28. void reset()
  29. {
  30.     for(int i=0; i<MAX; i++){
  31.         adj[i].clear();
  32.         for(int j=0; j<MAX; j++) rGraph[i][j] = 0;
  33.         parent[i] = -1;
  34.     }
  35. }
  36.  
  37. bool bfs()
  38. {
  39.     memset(vis, false, sizeof vis);
  40.     queue<int> Q;
  41.     Q.push(S);
  42.     vis[S] = true;
  43.  
  44.     while(!Q.empty()){
  45.         int u = Q.front();
  46.         Q.pop();
  47.         for(int i=0; i<adj[u].size(); i++){
  48.             int v = adj[u][i];
  49.             if(vis[v] == false && rGraph[u][v] > 0){
  50.                 vis[v] = true;
  51.                 parent[v] = u;
  52.                 Q.push(v);
  53.             }
  54.         }
  55.     }
  56.     return (vis[T] == true);
  57. }
  58.  
  59. int edmonds_karp()
  60. {
  61.     int max_flow = 0;
  62.     while(bfs()){
  63.         int path_flow = INT_MAX;
  64.         int u, v;
  65.         for(v=T; v!=S; v=parent[v]){
  66.             u = parent[v];
  67.             path_flow = min(path_flow, rGraph[u][v]);
  68.         }
  69.         for(v=T; v!=S; v=parent[v]){
  70.             u = parent[v];
  71.             rGraph[u][v] -= path_flow;
  72.             rGraph[v][u] += path_flow;
  73.         }
  74.         max_flow += path_flow;
  75.     }
  76.     return max_flow;
  77. }
  78.  
  79. int main()
  80. {
  81.     int cases;
  82.     scanf("%d", &cases);
  83.     int caseno = 0;
  84.     while(cases--){
  85.         reset();
  86.         int node, edge;
  87.         scanf("%d", &node);
  88.         scanf("%d %d %d", &S, &T, &edge);
  89.         for(int i=0; i<edge; i++){
  90.             int u, v, c;
  91.             scanf("%d %d %d", &u, &v, &c);
  92.             addedge(u, v, c);
  93.         }
  94.         printf("Case %d: %d\n", ++caseno, edmonds_karp());
  95.     }
  96. }
  97.  
  98. /*
  99.     4
  100.     4
  101.     1 4 2
  102.     4 1 232
  103.     1 4 490
  104.     3
  105.     1 2 2
  106.     3 2 188
  107.     2 1 100
  108.     7
  109.     2 6 6
  110.     3 6 127
  111.     3 4 515
  112.     4 6 114
  113.     2 3 123
  114.     7 1 866
  115.     4 7 588
  116.     3
  117.     3 1 7
  118.     1 3 763
  119.     1 2 883
  120.     3 1 383
  121.     1 2 641
  122.     2 1 411
  123.     2 3 229
  124.     2 1 345
  125.  
  126.     Case 1: 722
  127.     Case 2: 100
  128.     Case 3: 123
  129.     Case 4: 1375
  130. */
Add Comment
Please, Sign In to add comment