Pagini recente » Cod sursa (job #1878664) | Cod sursa (job #475766) | Cod sursa (job #2143391) | Cod sursa (job #1525071) | Cod sursa (job #460616)
Cod sursa(job #460616)
#include <stdio.h>
#include <vector>
#include <queue>
#define Nmax 1005
#define pb push_back
#define INF 2147000000
using namespace std;
vector< int > G[Nmax];
vector< int >::iterator it;
queue< int > Q;
int C[Nmax][Nmax],F[Nmax][Nmax];
int viz[Nmax],prev[Nmax];
int n,m,i,x,y,z,wh;
int fmin,fmax;
inline int Minim(int x,int y){ return x<y ? x:y; }
int BF(){
memset(viz,0,sizeof(viz));
Q.push(1); viz[1]=1;
while( ! Q.empty() ){
x=Q.front();
if(x != n )
for(it=G[x].begin(); it!=G[x].end(); ++it)
if(! viz[*it] && F[x][*it] < C[x][*it]){
viz[*it]=1;
prev[*it]=x;
Q.push(*it);
}
Q.pop();
}
return viz[n];
}
int main(){
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&z);
C[x][y]=z;
G[x].pb(y);
G[y].pb(x);
}
while( BF() )
for(it=G[n].begin(); it!=G[n].end(); ++it)
if( viz[*it] ){
fmin=INF; prev[n]=*it;
for( wh=n; fmin != 0 && wh!=1; wh=prev[wh])
fmin=Minim(fmin,C[prev[wh]][wh]-F[prev[wh]][wh]);
if( fmin == 0 ) continue;
for(wh=n; wh!=1; wh=prev[wh]){
F[prev[wh]][wh] += fmin;
F[wh][prev[wh]] -= fmin;
}
fmax += fmin;
}
printf("%d\n",fmax);
fclose(stdin); fclose(stdout);
return 0;
}