Pagini recente » Cod sursa (job #1737395) | Cod sursa (job #2105333) | Cod sursa (job #1202602) | Cod sursa (job #388114) | Cod sursa (job #563958)
Cod sursa(job #563958)
#include<stdio.h>
#include<vector>
#define NMAX 1001
#define sz [NMAX][NMAX]
#define INF 0x3f3f3f3f
using namespace std;
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
int N,M,cap sz,flux sz,tata[NMAX],viz[NMAX],c[NMAX];
vector <int> a[NMAX];
int bf(){
memset(viz,0,sizeof(viz));
int p=1,u=1;
c[1]=1;
viz[1]=1;
while(p<=u){
int nod=c[p];
for(int i=0;i<(int)a[nod].size();++i)
if(!viz[a[nod][i]] && cap[nod][a[nod][i]] > flux[nod][a[nod][i]])
{ viz[a[nod][i]]=1;
c[++u]=a[nod][i];
tata[a[nod][i]]=nod;
if(a[nod][i]==N)
return 1;
}
p++;
}
return 0;
}
int main(){
fscanf(f,"%d%d",&N,&M);
for(int i=1;i<=M;++i){
int x,y,c;
fscanf(f,"%d%d%d",&x,&y,&c);
cap[x][y]+=c;
a[x].push_back(y);
a[y].push_back(x);
}
int flow=0;
while(bf()){
for(int i=0;i<a[N].size();++i){
if ( viz [a[N][i]] ){
tata[N]=a[N][i];
int fmn=INF;
for(int nod=N;nod!=1;nod=tata[nod])
fmn=min(fmn, cap[tata[nod]][nod]-flux[tata[nod]][nod]);
if(fmn!=0)
for(int nod=N;nod!=1;nod=tata[nod])
flux[tata[nod]][nod]+=fmn,
flux[nod][tata[nod]]-=fmn;
flow+=fmn;
}
}
}
fprintf(g,"%d",flow);
return 0;
}