Pagini recente » Cod sursa (job #254905) | Cod sursa (job #253523)
Cod sursa(job #253523)
//graful G=(X,U) este orientat si este o retea de transport cu vs si vf
//varful de start respectiv varful final
//capacitate[i][j]=capacitatea arcului (i,j)
//flux[i][j]=fluxul arcului (i,j)
//c[] este coada, pp pozitia primului, pu pozitia ultimului din coada
//min[i] este minimul pe drumul de la vs pana la i
//pred[x] este pozitia predecesorului nodului c[x], este 0 daca nu exista predecesor
//viz[i]=1 daca i a fost deja vizitat, 0 daca nu a fost inca vizitat
#include<stdio.h>
# define nn 1001
int n, capacitate[nn][nn], vs, vf, c[nn], pred[nn], viz[nn], min[nn];
int bfs(int vs, int vf, int capacitate[nn][nn], int flux[nn][nn])
{
int pp, pu, i, j, v;
for (i=1;i<=n;i++) {viz[i]=0; min[i]=30000;}
c[1]=vs; pp=1; pu=1;
viz[vs]=1; pred[1]=0;
while ((pp<=pu)&&(viz[vf]==0))
{
i=c[pp];
for (j=1;j<=n;j++)
if (viz[j]==0)
{
v=capacitate[i][j]-flux[i][j];
if (v>0)
{
pu++; c[pu]=j; pred[pu]=pp;
viz[j]=1;
if (v<min[i]) min[j]=v;
else min[j]=min[i];
if (j==vf) break;
}
else
if ((capacitate[j][i]>0)&&(flux[j][i]>0))
{
pu++; c[pu]=j; pred[pu]=pp;
viz[j]=1;
if (flux[j][i]<min[i]) min[j]=flux[j][i];
else min[j]=min[i];
if (j==vf) break;
}
}
pp++;
}
if (viz[vf]==1)
{
j=pu;
i=pred[j];
while (i>0)
{
if (capacitate[c[i]][c[j]]>flux[c[i]][c[j]])
{ flux[c[i]][c[j]]+=min[vf]; }
else { flux[c[j]][c[i]]-=min[vf];}
j=i;
i=pred[j];
}
return min[vf];
}
else return 0;
}
int main()
{
int i,j,u,v,w,s,m, flux[nn][nn];
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%i",&n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{ capacitate[i][j]=0; flux[i][j]=0; }
scanf("%i",&m);
for (i=1;i<=m;i++)
{
scanf("%i%i%i",&u,&v,&w);
capacitate[u][v]=w;
}
s=0;
do
{
w=bfs(1,n,capacitate,flux);
s+=w;
}
while (w>0);
printf("%i",s);
fclose(stdin);
fclose(stdout);
return 0;
}