Cod sursa(job #717804)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 20 martie 2012 11:14:52
Problema Flux Scor 16
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <fstream>
#include <vector>
#include <stdlib.h>
#include <algorithm>
using namespace std;

const int dim = 105;
const double e = 0.0000001;
int N, M, nviz, Y[dim], Z[dim];
double A[dim][dim], C[dim], nr[dim][dim], X[dim], viz[dim];

int zero (double a)
{
	if (-e < a && a < e) 
		return 1;
	return 0;
}

double abso (double a)
{
	if (a > 0) 
		return a;
	return -a;
}

void cit ()
{
	double c;
	int x, y;
	
	scanf ("%d %d", &N, &M); 
	N--;
	
	for (int i = 1; i <= M; i++)
	{
		scanf ("%d %d %lf", &x, &y, &c);
		x--, y--;
		
		//C[y][x] = C[x][y] = (C[x][y] == 0 ? c : min (c, C[x][y]));
		Y[i] = x;
		Z[i] = y;
		C[i] = c;
		
		nr[x][y] ++;
		nr[y][x] ++;
	}	
}

void dfs (int n)
{
	viz[n] = 1;
	nviz++;
	
	for (int f = 0; f <= N; f++)
		if (nr[n][f] > 0 && viz[f] == 0)
			dfs (f);
}

void prep ()
{
	int i, j;
	for (i = 1; i <= N; i++)
	{
		for (j = 0; j <= N; j++)
		{
			A[i][i] += nr[i][j];
			if (j == 0)
				continue;
			A[i][j] -= nr[i][j];
		}		
	}
	A[N][N+1] = 1;
}

void gauss ()
{
	int i, j, n, m;
	for (i = 1; i <= N; i++)
		viz[i] = 0;
	
	for (i = j = 1; i <= N && j <= N; i++, j++)
	{
		for (n = i; n <= N && zero (A[n][j]); n++);
		if (n > N)
		{
			i--;
			continue;
		}
		
		if (n != i)
		{
			for (m = 1; m <= N+1; m++)
			{
				swap (A[i][m], A[n][m]);
			}
		}
		
		for (n = i; n <= N; n++)
		{
			for (m = j + 1; m <= N+1; m++)
			{
				A[n][m] /= A[n][j];
			}
			A[n][j] = 1;
			
			if (n != i)
			{
				for (m = j; m <= N+1; m++)
				{
					A[n][m] -= A[i][m];
				}
			}
		}
	}
	
	for (i = N; i >= 1; i--)
	{
		m = 0;
		for (j = 1; j <= N; j++)
		{
			if ( zero (A[i][j]) )
				continue;
			
			if (viz[j] == 1)
			{
				A[i][j] *= X[j];
			}
			else
			{
				if (m == 0)
				{
					m = j;
				}
				else
				{
					X[j] = 0;
					A[i][j] = 0;
					viz[j] = 1;
				}				
			}			
		}
		
		for (j = 1; j <= N; j++)
		{
			if (j != m)
			{
				A[i][N+1] -= A[i][j];
			}			
		}
		if (m == 0 && !zero (A[i][N+1]))
		{
			nviz = 0;
			return;
		}
		if (m != 0)
		{
			X[m] = A[i][N+1] / A[i][m];
			A[i][m] = 0;
			viz[m] = 1;
		}
	}
}

void fin ()
{
	int i, j;
	double c, f, r = (1<<31)-1;
	for (i = 1; i <= M; i++)
	{
		c = C[i];
		f = abso (X[Z[i]] - X[Y[i]]);
		if (f == 0) 
			f = e / 2;
		if (r > c / f)
			r = c / f;
	}
	printf ("%.3lf\n", r);
}

int main ()
{
	freopen ("flux.in", "r", stdin);
	freopen ("flux.out", "w", stdout);
	
	cit ();
	dfs (0);
	if (nviz != N + 1)
	{
		printf ("0\n");
		return 0;
	}
	
	prep ();
	gauss ();
	if (nviz != N + 1)
	{
		printf ("0\n");
		return 0;
	}
	
	fin ();
	
	return 0;
}