Cod sursa(job #390111)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 2 februarie 2010 23:15:58
Problema Flux Scor 12
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.29 kb
#include <cstdio>
#include <vector>

using namespace std;

#define file_in "flux.in"
#define file_out "flux.out"

#define Nmax 5111

double C[Nmax][Nmax];
double F[Nmax][Nmax];
int n,m,viz[Nmax];



int bfs()
{
	int q[Nmax],i,x,p,u;
	memset(viz,0,sizeof(viz));
	q[0]=1;
	viz[1]=-1;
	p=u=0;
	
	while(p<=u)
	{
		x=q[p];
		for (i=1;i<=n;++i){
		      if (!viz[i] && C[x][i]>F[x][i])
			  {
				  viz[i]=x;
				  q[++u]=i;
				  if (i==n)
					  return 1;
			  }
		}
		p++;
	}
	
	return 0;
}
	
double flow()
{
	int i,j;
	double v,maxflow=0;
	
	for(;bfs();)
	{
		for (i=1;i<=n;++i)
        {
			if (viz[i]<=0 || C[i][n]<=F[i][n]) continue;
        v=C[i][n]-F[i][n];
		for (j=i;j!=1;j=viz[j])    
 	         v=min(v,C[viz[j]][j]/F[viz[j]][j]);	 
        if (v==0)
			continue;
		F[i][n]+=v;
		F[n][i]-=v;
		
		for (j=i;j!=1;j=viz[j])    
		{
			F[viz[j]][j]+=v;
			F[j][viz[j]]-=v;
		}
		maxflow+=v;
		}
	}
	
	return maxflow;
}


int main()
{
	int i,a,b;
	double c;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %lf", &a, &b, &c);
		C[a][b]=c;
		C[b][a]=-c;
	}
	
	printf("%.3lf\n", flow());
	
	fclose(stdin);
	fclose(stdout);
	
	
	return 0;
	
}