Advertisement
a_pramanik

Max Flow --- LOJ(1153) Internet BandWidth

Jun 10th, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. ///:-)
  2. #include <bits/stdc++.h>
  3. #define pb push_back
  4. #define ll long long int
  5. #define inf 2000000000
  6. #define sc(n) scanf("%d", &n)
  7. #define Aktaruzzaman using
  8. #define scl(n) scanf("%lld", &n)
  9. #define scd(n) scanf("%lf", &n)
  10. #define pi (2.0*acos(0.0))
  11. #define Pramanik namespace std;
  12. #define vsort(v)   sort(v.begin(),v.end())
  13. #define ull unsigned long long int
  14. #define mem(a, b) memset(a, b, sizeof a)
  15. #define cf 100009
  16. Aktaruzzaman Pramanik
  17. int vis[105], par[105];
  18. int w[105][105];
  19. vector<int>a[105];
  20. int n, src, sink;
  21.  
  22. bool bfs()  // for checking is there is any connection between src and sink
  23. {
  24.     queue<int>q;
  25.     mem(vis, 0);
  26.     mem(par, -1);
  27.     q.push(src);
  28.     vis[src]=1;
  29.     bool flg = false;
  30.     while(!q.empty() && flg==false)
  31.     {
  32.         int x = q.front();
  33.         q.pop();
  34.  
  35.         for(int i=0; i<a[x].size(); i++){
  36.             int y = a[x][i];
  37.             if(vis[y]==0 && w[x][y]>0){
  38.                     if(y==sink)flg=true;
  39.                     par[y]=x;
  40.                 q.push(y);
  41.                 vis[y]=1;
  42.  
  43.             }
  44.         }
  45.  
  46.     }
  47.     return flg;
  48. }
  49.  
  50. int maxFlow()
  51. {
  52.     int tot=0;
  53.  
  54.     while(1){
  55.         if(bfs()==false)break;
  56.  
  57.         int cst = inf;
  58.  
  59.         //finding minimum edge cost
  60.         for(int y = sink; y!=src; y = par[y]){
  61.             int x = par[y];
  62.  
  63.             cst = min(cst, w[x][y]);
  64. //            printf("Cost = %d\n", cst);
  65.         }
  66.         //relaxing paths
  67.         for(int y = sink; y!=src; y = par[y]){
  68.             int x = par[y];
  69.             w[x][y]-=cst;
  70.             w[y][x]+=cst;
  71.         }
  72.  
  73.         tot+=cst;
  74.     }
  75.     return tot;
  76. }
  77.  
  78. int main()
  79. {
  80.     int t, i, j, k, x, y, c;
  81.     int cc = 0;
  82.     scanf("%d", &t);
  83.  
  84.     while(t--){
  85.         scanf("%d", &n);
  86.         scanf("%d%d%d", &src, &sink, &c);
  87.         mem(w, 0);
  88.         while(c--){
  89.             scanf("%d%d%d", &x, &y, &k);
  90.             w[x][y]+=k;
  91.             w[y][x]+=k;
  92.             if(w[x][y]==k)a[x].pb(y); //same edge duibar connect na howar jonno
  93.             if(w[y][x]==k)a[y].pb(x); //same edge duibar connect na howar jonno
  94.         }
  95.  
  96.         printf("Case %d: %d\n", ++cc, maxFlow());
  97.  
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement