Cod sursa(job #912377)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#include <algorithm>
#include <cstring>
#define DN 205
using namespace std;
typedef vector<int>::iterator it;
int n,m,fl[DN][DN],cap[DN][DN],pre[DN];
vector<int> gr[DN];
queue<int> c;
bitset<DN> viz;
int bfs(int s,int d) {
viz&=0;
for(int i=0; i<=n; ++i) pre[i]=-1;
for(c.push(s);c.size();c.pop()) {
int fr=c.front();
viz[fr]=1;
for(it i=gr[fr].begin(); i!=gr[fr].end(); ++i) if(!viz[*i] && fl[fr][*i]<cap[fr][*i]) {
pre[*i]=fr;
c.push(*i);
}
}
return viz[d];
}
int flow(int s, int d, int cap[DN][DN]) {
memset(fl,0,sizeof(fl));
int r=0;
for(;bfs(s,d);) for(int i=0; i<=n; ++i) if(fl[i][d]<cap[i][d]){
int cmin=cap[i][d]-fl[i][d];
for(int y=i; pre[y]!=-1; cmin=min(cmin,cap[pre[y]][y]-fl[pre[y]][y]),y=pre[y]);
r+=cmin;
fl[i][d]+=cmin; fl[d][i]-=cmin;
for(int y=i; pre[y]!=-1; fl[pre[y]][y]+=cmin,fl[y][pre[y]]-=cmin,y=pre[y]);
}
return r;
}
int fol[DN][DN],ind[DN][DN];
vector<int> rez;
int main()
{
ifstream f("maxflow.in");
ofstream g("maxflow.out");
f>>n>>m;
for(int i=1; i<=m; ++i) {
int a,b,c;
f>>a>>b>>c;
ind[a][b]=ind[b][a]=i;
gr[a].push_back(b);
// gr[b].push_back(a);
cap[a][b]=c;//=cap[b][a]=c;
}
g<<flow(1,n,cap);
return 0;
}