Pagini recente » Cod sursa (job #2966826) | Cod sursa (job #790194) | Cod sursa (job #629257) | Cod sursa (job #316041) | Cod sursa (job #517686)
Cod sursa(job #517686)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define dim 1024
#define dim2 5005
using namespace std;
int A[dim][dim],F[dim][dim],n,m,i,x,y,c,coada[dim2],viz[dim],min,u[dim2],s,d,j,ok,in,sf,flux,J,val,aux;
void citire()
{
FILE *f=fopen("maxflow.in","r");
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=m;i++)
{
fscanf(f,"%d %d %d",&x,&y,&c);
//coada[y]=1;
//viz[x]=1;
A[x][y]=c;
}
fclose(f);
}
void bfs(int x)
{
viz[x]=1;
coada[1]=x; in=sf=1;
while(in<=sf && !viz[d])
{
x=coada[in++]; J=in-1;
for(i=1;i<=n;i++)
if(! viz[ i ])
if(F[x][i]<A[x][i] )
{
viz[i]=A[x][i]-F[x][i];
coada[++sf]=i;
u[sf]=J;
}
else if( F[i][x]>0 )
{
viz[i]=F[i][x];
coada[++sf]=i;
u[sf]=J;
}
}
if(!viz[d])
ok=0;
viz[1]=0;
return;
}
int main()
{
FILE *g=fopen("maxflow.out","w");
citire();
s=1; d=n;
ok=1;
while(ok)
{
bfs(s);
min=10000;
if(ok)
{
for(j=sf;j>1;j)
{
y=coada[j];
val=viz[y];
if(val<min)
min=val;
j=u[j];
}
for(j=sf;j>1;j)
{
x=coada[u[j]];
y=coada[j];
if(A[x][y]>0)
F[x][y]+=min;
else F[y][x]-=min;
j=u[j];
}
memset(coada,0,sizeof(coada));
memset(viz,0,sizeof(viz));
}
}
for(i=1;i<=n;i++)
flux+=F[s][i];
fprintf(g,"%d\n",flux);
return 0;
}