Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ctime>
- #include <algorithm>
- #include <iostream>
- #include <sstream>
- #include <string>
- #include <vector>
- #include <queue>
- #include <set>
- #include <map>
- #include <cstdio>
- #include <cstdlib>
- #include <cctype>
- #include <cmath>
- using namespace std;
- typedef long long LL;
- #define FOR(k,a,b) for(int k(a); k < (b); ++k)
- #define REP(k,a) for(int k=0; k < (a); ++k)
- int calc(char c)
- {
- if(c>='A' && c<='Z')
- return c-'A';
- return c-'a'+'Z'-'A'+1;
- }
- int main()
- {
- int N,c,S=0,T='Z'-'A',maxflow=0,o,mxo;
- char a,b;
- cin >> N;
- const int R=('Z'-'A'+1)*2;
- int cap[R][R],res[R][R],act[R][R],visited[R];
- deque<int> q;
- memset(cap,0,sizeof(cap));
- memset(act,0,sizeof(act));
- REP(i,N)
- {
- cin >> a >> b >> c;
- cap[calc(a)][calc(b)]+=c;
- }
- while(true)
- {
- //calculate residual
- memset(res,0,sizeof(res));
- REP(i,R)
- REP(j,R)
- {
- res[i][j]+=cap[i][j]-act[i][j];
- res[j][i]+=act[i][j];
- }
- //bfs find shortest augment path
- memset(visited,-1,sizeof(visited));
- q.push_back(0);
- visited[0]=0;
- while(q.size())
- {
- o=q.front();
- q.pop_front();
- REP(i,R)
- {
- if(visited[i]!=-1 || res[o][i]==0)
- continue;
- visited[i]=o;
- if(i==T)
- {
- q.clear();
- break;
- }
- else
- q.push_back(i);
- }
- }
- //calculate maximum
- o=T;
- mxo=((int)1e9);
- while(o>0)
- {
- mxo=min(mxo,res[visited[o]][o]);
- o=visited[o];
- }
- if(visited[T]==-1 || mxo==0)
- break;
- maxflow+=mxo;
- o=T;
- while(o>0)
- {
- act[visited[o]][o]+=mxo;
- o=visited[o];
- }
- }
- cout << maxflow << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment