iscsi

Spoj Total Flow

Sep 20th, 2011
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <ctime>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <sstream>
  5. #include <string>
  6. #include <vector>
  7. #include <queue>
  8. #include <set>
  9. #include <map>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. #include <cctype>
  13. #include <cmath>
  14. using namespace std;
  15. typedef long long LL;
  16. #define FOR(k,a,b) for(int k(a); k < (b); ++k)
  17. #define REP(k,a) for(int k=0; k < (a); ++k)
  18.  
  19. int calc(char c)
  20. {
  21.     if(c>='A' && c<='Z')
  22.         return c-'A';
  23.     return c-'a'+'Z'-'A'+1;
  24. }
  25.  
  26. int main()
  27. {
  28.     int N,c,S=0,T='Z'-'A',maxflow=0,o,mxo;
  29.     char a,b;
  30.     cin >> N;
  31.     const int R=('Z'-'A'+1)*2;
  32.     int cap[R][R],res[R][R],act[R][R],visited[R];
  33.     deque<int> q;
  34.     memset(cap,0,sizeof(cap));
  35.     memset(act,0,sizeof(act));
  36.     REP(i,N)
  37.     {
  38.         cin >> a >> b >> c;
  39.         cap[calc(a)][calc(b)]+=c;
  40.     }
  41.     while(true)
  42.     {
  43.         //calculate residual
  44.         memset(res,0,sizeof(res));
  45.         REP(i,R)
  46.         REP(j,R)
  47.         {
  48.             res[i][j]+=cap[i][j]-act[i][j];
  49.             res[j][i]+=act[i][j];
  50.         }
  51.         //bfs find shortest augment path
  52.         memset(visited,-1,sizeof(visited));
  53.         q.push_back(0);
  54.         visited[0]=0;
  55.         while(q.size())
  56.         {
  57.             o=q.front();
  58.             q.pop_front();
  59.             REP(i,R)
  60.             {
  61.                 if(visited[i]!=-1 || res[o][i]==0)
  62.                     continue;
  63.                 visited[i]=o;
  64.                 if(i==T)
  65.                 {
  66.                     q.clear();
  67.                     break;
  68.                 }
  69.                 else
  70.                     q.push_back(i);
  71.             }
  72.         }
  73.         //calculate maximum
  74.         o=T;
  75.         mxo=((int)1e9);
  76.         while(o>0)
  77.         {
  78.             mxo=min(mxo,res[visited[o]][o]);
  79.             o=visited[o];
  80.         }
  81.         if(visited[T]==-1 || mxo==0)
  82.             break;
  83.         maxflow+=mxo;
  84.         o=T;
  85.         while(o>0)
  86.         {
  87.             act[visited[o]][o]+=mxo;
  88.             o=visited[o];
  89.         }
  90.     }
  91.     cout << maxflow << endl;
  92.     return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment