Pagini recente » Cod sursa (job #83496) | Cod sursa (job #352947) | Cod sursa (job #1514281) | Cod sursa (job #2480974) | Cod sursa (job #247034)
Cod sursa(job #247034)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NMAX 1020
#define IN "maxflow.in"
#define OUT "maxflow.out"
#define INF 1<<30
FILE *f=fopen(IN,"rt");
FILE *g=fopen(OUT,"wt");
int *G[NMAX];
int 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;
G[y][0]++;
G[y]=(int*)realloc(G[y],(G[y][0]+1)*sizeof(int));
G[y][G[y][0]]=x;
}
}
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;
D[vf]=nd;
if(vf==n) return 1;
}
}
return viz[n];
}
void solve(){
int j,minn;
for(;bfs();){
minn=INF;
for(j=n;j!=1;j=D[j])minn = min(minn,C[D[j]][j] - F[D[j]][j]);
if(!minn) continue;
for(j=n;j!=1;j=D[j]){
F[D[j]][j] += minn;
F[j][D[j]] -= minn;
}
flux+=minn;
}
}
int main(){
date();
solve();
fprintf(g,"%d",flux);
return 0;
}