Cod sursa(job #323481)

Utilizator raduzerRadu Zernoveanu raduzer Data 12 iunie 2009 11:36:58
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <vector>
using namespace std;

#define pb push_back
#define mp make_pair
#define x first
#define y second
#define forit(it, v) for (typeof(v.begin()) it = v.begin(); it != v.end(); ++it)

const int MAX_N = 256;

int n, m;
double a[MAX_N][MAX_N];
vector < pair <int, int> > v[MAX_N];

void make()
{
	for (int i = 1; i <= n; ++i)
	{
		int s = 0;
		
		forit(it, v[i])
		{
			a[i][it->x] = -1.0 / v[i].size();
			s += it->y;
		}
		
		a[i][n + 1] = s / v[i].size();
		a[i][i] = 1;
		a[n][n] = 1;
	}
}

void chg(int l1, int l2)
{
	for (int j = 1; j <= n + 1; ++j)
	{
		double aux = a[l1][j];
		a[l1][j] = a[l2][j];
		a[l2][j] = aux;
	}
}

void op(int l1, int l2, double val)
{
	for (int i = 1; i <= n + 1; ++i)
		a[l1][i] += val * a[l2][i];
}

void gauss()
{
	for (int i = 1; i <= n; ++i)
	{	
		for (int j = i; i <= n; ++j)
			if (a[j][i])
			{
				chg(i, j);
				break;
			}
		
		for (int j = 1; j <= n; ++j)
			if (i != j && a[j][i] != 0)
				op(j, i, (double)-a[j][i] / a[i][i]);
	}
}

int main()
{
	int i, x, y, z;
	freopen("tunel.in", "r", stdin);
	freopen("tunel.out", "w", stdout);
	
	scanf("%d %d", &n, &m);
	
	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d %d", &x, &y, &z);
		
		v[x].pb(mp(y, z));
		v[y].pb(mp(x, z));
	}
	
	make();
	gauss();
	
	printf("%lf\n", a[1][n + 1] / a[1][1]);
}