Cod sursa(job #717709)

Utilizator Robert29FMI Tilica Robert Robert29 Data 20 martie 2012 10:17:57
Problema Flux Scor 96
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>
#include<vector>
using namespace std;
FILE*f=fopen("flux.in","r");
FILE*g=fopen("flux.out","w");
int n,m;
double maxx,a[103][103],w[104];
struct muchii
{
	int x,y,z;
}v[5002];
double intreg (double a)
{
	if(a<0)
		return -a;
	return a;
}
vector <int> V[102];
char viz[103];
void dfs(int nod)
{
	
	viz[nod]=1;
	for(int i=0;i<V[nod].size();++i)
		if(!viz[V[nod][i]])
			dfs(V[nod][i]);
}
int main()
{
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		fscanf(f,"%d%d%d",&v[i].x,&v[i].y,&v[i].z);
		V[v[i].x].push_back (v[i].y);
		V[v[i].y].push_back (v[i].x);
		a[v[i].x][v[i].x]++;
		a[v[i].x][v[i].y]--;
		a[v[i].y][v[i].x]--;
		a[v[i].y][v[i].y]++;
		
	}
	
	a[n][n+1]=1;

	for(int i=2;i<=n;++i)
	{
		
		int t=i;
		while(!a[t][i]&&t<=n)
			++t;
		if(t<=n)
		{
			for(int ii=i;ii<=n+1;++ii)
			{
				double aux=a[i][ii];
				a[i][ii]=a[t][ii];
				a[t][ii]=aux;
			}
			
			for(int j=i+1;j<=n;++j)
			{
				double y=a[j][i]/a[i][i];
				for(t=i;t<=n+1;++t)
					a[j][t]-=y*a[i][t];
			}
		}
	}
	
	for(int i=n;i>1;--i)
	{
		
		for(int j=n;j>i;--j)
			a[i][n+1]-=w[j]*a[i][j];
		w[i]=a[i][n+1]/a[i][i];
	}
	
	dfs(1);
	if(viz[n])
	{
		maxx=2000000000;
		for(int i=1;i<=m;++i)
			if(intreg(v[i].z/(w[v[i].y]-w[v[i].x]))<maxx)
				maxx=intreg(v[i].z/(w[v[i].y]-w[v[i].x]));
	}else
		fprintf(g,"0");

	fprintf(g,"%.3lf",maxx);
	fclose(f);
	fclose(g);
	return 0;
}