Pagini recente » Cod sursa (job #3244561) | Cod sursa (job #2767986) | Cod sursa (job #2954970) | Cod sursa (job #599968) | Cod sursa (job #548166)
Cod sursa(job #548166)
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 1005
int c[maxn][maxn],f[maxn][maxn];
int tata[maxn],q[maxn];
int n,flux,cf,sursa,destinatie;
void citire(void)
{ FILE *fin=fopen("maxflow.in","r");
int m,i,j;
fscanf(fin,"%d%d",&n,&m);
for(;m;m--)
fscanf(fin,"%d%d",&i,&j),
fscanf(fin,"%d",&c[i][j]);
fclose(fin);
}
int bfs(void)
{ int prim,ultim,u,v;
memset(tata+1,0,sizeof(int)*n);
tata[1]=-1; prim=ultim=0; q[0]=1;
while(prim<=ultim)
{ u=q[prim++];
for(v=1;v<=n;v++)
if(c[u][v]-f[u][v]>0 && !tata[v])
{ q[++ultim]=v; tata[v]=u; }
}
if(!tata[destinatie]) return 0;
return 1;
}
void EdmondKarp(void)
{ int k,i;
sursa=1; destinatie=n; flux=0;
while(bfs())
for(i=1;i<=n;i++)
if(c[i][n]-f[i][n]>0)
{ cf=c[i][n]-f[i][n];
k=i;
while(k!=sursa)
{ if(cf>c[tata[k]][k]-f[tata[k]][k]) cf=c[tata[k]][k]-f[tata[k]][k];
k=tata[k];
}
k=i;
while(k!=sursa)
{ f[tata[k]][k]+=cf; f[k][tata[k]]-=cf;
k=tata[k];
}
f[i][n]+=cf; f[n][i]-=cf;
flux+=cf;
}
}
void scrie(void)
{ FILE *fout=fopen("maxflow.out","w");
fprintf(fout,"%d",flux);
fclose(fout);
}
int main(void)
{ citire();
EdmondKarp();
scrie();
return 0;
}