Pagini recente » Cod sursa (job #360887) | Cod sursa (job #1766903) | Cod sursa (job #190277) | Cod sursa (job #1810107) | Cod sursa (job #362663)
Cod sursa(job #362663)
#include <stdio.h>
#include <vector>
#define pb push_back
#define Nmax 1005
#define INF 2000000000
using namespace std;
int c[Nmax][Nmax],f[Nmax][Nmax];
vector< int > G[Nmax];
int n,m,i,x,y,fmin,q,flow,z;
int Q[Nmax], viz[Nmax],tata[Nmax];
int BF(){
int i,nod;
vector< int >:: iterator it;
memset(viz,0,sizeof(viz));
Q[0]=Q[1]=viz[1]=1;
for(i=1; i<=Q[0]; ++i){
nod=Q[i];
if( nod == n ) continue;
for(it=G[nod].begin(); it!=G[nod].end(); it++){
if( c[nod][*it] == f[nod][*it] || viz[*it] ) continue;
viz[*it]=1;
Q[++Q[0]]=*it;
tata[*it]=nod;
}
}
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);
}
vector< int >:: iterator nod;
for( ; BF(); )
for(nod=G[n].begin(); nod!=G[n].end(); nod++){
if( c[*nod][n] == f[*nod][n] || !viz[*nod] ) continue;
tata[n] = *nod;
fmin = INF;
for( q=n; q!=1; q=tata[q] )
fmin = min( fmin, c[tata[q]][q] - f[tata[q]][q] );
for( q=n; q!=1; q=tata[q] ){
f[tata[q]][q] += fmin;
f[q][tata[q]] -= fmin;
}
flow += fmin;
}
printf("%d\n",flow);
fclose(stdin); fclose(stdout);
return 0;
}