Pagini recente » Cod sursa (job #2372500) | Cod sursa (job #2888734) | Cod sursa (job #636919) | Cod sursa (job #2952773) | Cod sursa (job #1192399)
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
vector< vector<int> > vecini, maxflow, flow;
vector< int > t;
bool viz[1002];
int n,m;
bool bfs(){
int nod;
queue <int> Q;
memset(viz,0,sizeof(viz));
for(Q.push(1);!Q.empty();) {
nod=Q.front(); Q.pop();
for(vector<int>::iterator it=vecini[nod].begin();it!=vecini[nod].end();it++) {
if(!viz[*it] && flow[nod][*it]!=maxflow[nod][*it]) {
t[*it]=nod;
viz[*it]=true;
if(*it!=n)
Q.push(*it);
}
}
}
return viz[n];
}
int main() {
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int x, y;
in>>n>>m;
t.assign(n+1,0);
vecini.assign(n+1,t);
maxflow.assign(n+1,t);
flow.assign(n+1, t);
for(register int i=0; i<m; i++) {
in>>x>>y;
vecini[x].push_back(y);
vecini[y].push_back(x);
in>>maxflow[x][y];
}
int minim, flowcost=0 ;
while( bfs() ) {
for(vector<int>::iterator it=vecini[n].begin();it!=vecini[n].end();it++) {
t[n]=*it;
if(!viz[*it] || flow[*it][n]==maxflow[*it][n])
continue;
minim=1<<30;
for(register int i=n; i!=1 ; i=t[i])
minim=min(minim, maxflow[t[i]][i]-flow[t[i]][i]);
for(register int i=n;i!=1;i=t[i]) {
flow[i][t[i]]-=minim;
flow[t[i]][i]+=minim;
}
flowcost+=minim;
}
}
out<<flowcost<<"\n";
in.close(); out.close();
return 0;
}