Cod sursa(job #253523)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 5 februarie 2009 21:40:08
Problema Flux maxim Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 2.1 kb
//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;
}