Cod sursa(job #587141)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 3 mai 2011 23:10:38
Problema Flux Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <iostream>
#include <vector>
#include <string>

using namespace std;

#define NM 105
#define MM 5005
#define EPS 0.0000000001

double ab (double val)
{
	if (val < 0) return -val;
	return val;
}	

class gaussian_elimination
{
	int N;
	double matrix[][NM];
	
	int iszero (double val)
	{
		if (ab(val) < EPS) return 1;
		return 0;
	}	
	
	void swap_rows (int r1, int r2)
	{
		for (int i = 1; i <= N+1; ++i)
		{
			double aux = matrix[r1][i];
			matrix[r1][i] = matrix[r2][i];
			matrix[r2][i] = aux;
		}	
	}
	
	void substract_rows (int r1, int r2, double val)
	{
		for (int i = 1; i <= N+1; ++i) matrix[r1][i] -= matrix[r2][i] * val;
	}	
	
	public:

	void set_system (int n, double m[][NM])
	{
		N = n;
		
		for (int i = 1; i <= n; ++i) 
			for (int j = 1; j <= n+1; ++j) matrix[i][j] = m[i][j];
	}	
	
	vector <double> solve_system ()
	{
		vector <double> ans;
		
		for (int i = 1; i < N; ++i)
		{
			if (iszero(matrix[i][i]))
				for (int j = i + 1; j <= N; ++j) 
					if (!iszero(matrix[j][i]))
					{
						swap_rows(i, j);
						break;
					}	
					
			for (int j = i + 1; j <= N; ++j) substract_rows (j, i, matrix[j][i]/matrix[i][i]);		
		}	
		
		for (int i = N; i >= 1; --i)
		{
			for (int j = 1; j < i; ++j) substract_rows(j, i, matrix[j][i]/matrix[i][i]);
			
			ans.push_back(matrix[i][N+1]/matrix[i][i]);
		}	
		
		int s = 0, e = N - 1;
		while (s < e)
		{
			double aux = ans[s];
			ans[s] = ans[e];
			ans[e] = aux;
			++s, --e;
		}	
		
		return ans;
	}		
};

int main()
{
	int N, M, muchii[MM][3];
	double cmatrix[NM][NM], X[NM], smax = 2000000000;
	
	memset (cmatrix, 0, sizeof(cmatrix));
	
	freopen ("flux.in", "r", stdin);
	freopen ("flux.out", "w", stdout);
	
	scanf ("%d %d", &N, &M);
	
	for (int i = 1; i <= M; ++i)
	{
		int a, b, c;
		
		scanf ("%d %d %d", &a, &b, &c);
		
		muchii[i][0] = a;
		muchii[i][1] = b;
		muchii[i][2] = c;
		
		cmatrix[a-1][b-1] += 1;
		cmatrix[a-1][a-1] -= 1;
		cmatrix[b-1][a-1] += 1;
		cmatrix[b-1][b-1] -= 1;
	}	
	
	cmatrix[N-1][N] = -1;
	
	gaussian_elimination syst;
	syst.set_system (N-1, cmatrix);
	vector <double> values = syst.solve_system();
	
	X[1] = 0;
	for (int i = 2; i <= N; ++i) X[i] = values[i-2];
	
	for (int i = 1; i <= M; ++i)
	{
		int a = muchii[i][0];
		int b = muchii[i][1];
		int c = muchii[i][2];
		
		double cc = ab(X[b]-X[a]);
		smax = min (smax, (double)c/cc);
	}	
	
	printf ("%lf", smax);
	
	return 0;
}