Pagini recente » Cod sursa (job #672805) | Cod sursa (job #868895) | Cod sursa (job #1869444) | Cod sursa (job #1684811) | Cod sursa (job #246518)
Cod sursa(job #246518)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NMAX 1001
#define IN "maxflow.in"
#define OUT "maxflow.out"
#define INF 1<<31
FILE *f=fopen(IN,"rt");
FILE *g=fopen(OUT,"wt");
int *G[NMAX],viz[NMAX];
int F[NMAX][NMAX];
int C[NMAX][NMAX];
int D[NMAX],n,m;
int Q[NMAX],flux;
void date(){
int i,x,y,c;
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++){G[i]=(int *)realloc(G[i],(sizeof(int)));G[i][0]=0;}
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&x,&y,&c); C[x][y]=c;
G[x][0]++;
G[x]=(int*)realloc(G[x],(G[x][0]+1)*sizeof(int));
G[x][G[x][0]]=y;
}
}
int min(int a, int b){ return (a<b?a:b); }
int bfs(){
int p,l,nd,vf,i;
memset(viz,0,sizeof(viz));
Q[1]=1;
viz[1]=1;
l=1;p=0;
for(;p<=l && !viz[n];){
nd=Q[++p];
if(nd==n) continue;
for(i=1;i<=G[nd][0];i++){
vf = G[nd][i];
if(F[nd][vf] == C[nd][vf] || viz[vf]) continue;
Q[++l]=vf;
viz[vf]=1;
D[vf]=nd;
}
}
return viz[n];
}
void solve(){
int i,minn;
for(;bfs();){minn=INF;
for(i=n;i!=1;i=D[i])minn = min(minn,C[D[i]][i] - F[D[i]][i]);
if(!minn) continue;
for(i=n;i!=1;i=D[i]){
F[D[i]][i] += minn;
F[i][D[i]] -= minn;
}
flux+=minn;
}
}
int main(){
date();
solve();
fprintf(g,"%d",flux);
return 0;
}