Cod sursa(job #126163)

Utilizator raula_sanChis Raoul raula_san Data 21 ianuarie 2008 16:22:40
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <cstdio>
#include <vector>

#define dim 256

using namespace std;

int N;
int M;

double A[dim][dim];
double B[dim];

vector < pair <int, int> > G[dim];

void read()
{
	freopen("tunel.in", "rt", stdin);
	
	int i, a, b, c;
	
	for(scanf("%d %d", &N, &M), i=1; i<=M; ++i)
	{
		scanf("%d %d %d", &a, &b, &c);
		
		G[a].push_back(make_pair(b, c));
		G[b].push_back(make_pair(a, c));
	}	
	
	fclose(stdin);
}

void solve()
{
	int i, j, k, n;
	
	double c, t, x;
	
	for(i=1; i<N; ++i)
	{
		A[i][i] = 1;
		
		x = double (G[i].size());
		c = 1 / x;

		for(n=G[i].size(), j=0; j<n; ++j)
		{
			A[i][G[i][j].first] -= c;
			B[i] += c * G[i][j].second;
		}
	}
	
	A[N][N] = 1;
	B[N] = 0;	
	
	for(j=1; j<=N; ++j)
	{
		for(i=j; i<=N; ++i)
			if(A[i][j]) break;
		
		for(k=1; k<=N; ++k)
		{
			t = A[i][k];
			A[i][k] = A[j][k];
			A[j][k] = t;
		}
		
		t = B[i];
		B[i] = B[j];
		B[j] = t;
		
		for(i=1; i<=N; ++i)
			if(i != j)
			{
				c = -A[i][j] / A[j][j];
				
				for(k=1; k<=N; ++k)
					A[i][k] += c * A[j][k];
				
				B[i] += c * B[j];
			}
	}
}

void write()
{
	freopen("tunel.out", "wt", stdout);
	
	printf("%lf", B[1]/A[1][1]);
	
	fclose(stdout);
}

int main()
{
	read();
	solve();
	write();
	
	return 0;
}