kien_coi_1997

edmondskarp.cpp (4.1)

Mar 24th, 2014
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <map>
  4. #include <vector>
  5. #include <queue>
  6. #include <iostream>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. #define long long long
  11. #define f1(i,n) for (int i=1; i<=n; i++)
  12. #define f0(i,n) for (int i=0; i<n; i++)
  13. typedef pair<long, long> llll;
  14. #define X first
  15. #define Y second
  16.  
  17. #define N 202
  18. int n, m, LinkSize, Pending;
  19. vector<llll> a[N]; //
  20. int Max[N][N], Cur[N][N]; //
  21. int d[N], Parent[N];
  22. long Answer = 0; //
  23.  
  24. bool minimize(int &a, int b)
  25.     { if (a>b) a=b; else return false; return true; }
  26.  
  27. bool ford_bellman(int u, int Target){
  28.     queue<llll> qu;
  29.     memset(d, 0x3c, sizeof d);
  30.     d[u]=0, Parent[u]=0; qu.push(llll(0, u));
  31.    
  32.     while (qu.size()){
  33.         llll Top=qu.front(); qu.pop(); u=Top.Y;
  34.         if (d[u]!=Top.X) continue;
  35. //      printf("d[%d] = %d\n", u, d[u]);
  36.         for (int i=0; int v=a[u][i].Y; i++)
  37.         if (Cur[u][v]<Max[u][v]) {
  38.             if (minimize(d[v], d[u]+(Cur[u][v]>=0?1:-1)*a[u][i].X))
  39.             { Parent[v]=u; qu.push(llll(d[v], v)); }
  40.         }
  41.     }
  42.     return d[Target]!=0x3c3c3c3c;
  43. }
  44.  
  45. void enlarge(){
  46.     int Min=Pending;
  47.     for (int u=n; int p=Parent[u]; u=p)
  48.     minimize(Min, Cur[p][u]>=0 ? Max[p][u]-Cur[p][u] : -Cur[p][u]);
  49.     for (int u=n; int p=Parent[u]; u=p)
  50.     { Cur[p][u]+=Min; Cur[u][p]-=Min; }
  51.  
  52.     Pending-=Min;
  53.     Answer += 1LL*Min*d[n];
  54. }
  55.  
  56. void enter(){
  57.     f1(i,m) {
  58.         int x, y, z;
  59.         scanf("%d%d%d", &x, &y, &z);
  60.         a[x].push_back(llll(z, y));
  61.         a[y].push_back(llll(z, x));
  62.         Max[x][y]++;
  63.         Max[y][x]++;
  64.     }
  65.     f1(i,n) a[i].push_back(llll());
  66.     scanf("%d%d", &Pending, &LinkSize);
  67.     f1(i,n) f1(j,n) Max[i][j] *= LinkSize;
  68. }
  69.  
  70. main(){
  71. while (scanf("%d%d", &n, &m) > 0){
  72.     enter();
  73.     while (Pending && ford_bellman(1, n)) enlarge();
  74.     if (Pending) cout << "Impossible." << endl;
  75.     else cout << Answer << endl;
  76.  
  77.     f1(i,n) a[i].clear();
  78.     memset(Cur, 0, sizeof Cur);
  79.     memset(Max, 0, sizeof Max);
  80.     Answer=0;
  81. }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment