Cod sursa(job #110363)

Utilizator victorsbVictor Rusu victorsb Data 26 noiembrie 2007 15:57:31
Problema Tunelul groazei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

#define Nmax 256

const double eps = 10e-8;

int n, m;
int x[Nmax], y[Nmax], cost[Nmax];
int gr[Nmax];
double a[Nmax][Nmax], b[Nmax];

void citire()
{
	int i;

	scanf("%d %d\n", &n, &m);
	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d %d\n", &x[i], &y[i], &cost[i]);
		++gr[x[i]], ++gr[y[i]];
	}
}

int is0(double a)
{
	return (fabs(a) < eps);
}

void gauss()
{
	int i, j, k, ind = 1;
	double d;

	for (i = 1; i <= n; ++i)
	{
		if (is0(a[ind][i]))
		{
			for (j = i; j <= n; ++j)
				if (!is0(a[j][i]))
					break;

			for (k = i; k <= n; ++k)
				swap(a[ind][k], a[j][k]);
			swap(b[ind], b[j]);
		}

		d = a[ind][i];

		if (is0(d)) continue;

		for (j = i; j <= n; ++j)
			a[ind][j] /= d;
		b[ind] /= d;

		for (j = 1; j <= n; ++j)
			if (ind != j && !is0(a[j][i]))
			{
				d = a[j][i];
				for (k = i; k <= n; ++k)
					a[j][k] -= a[ind][k] * d;
				b[j] -= b[ind] * d;
			}
		++ind;
	}
}

void solve()
{
	int i;

    for (i = 1; i <= n; ++i)
	{
		a[x[i]][x[i]] = -1;
		a[y[i]][y[i]] = -1;
	}

	for (i = 1; i <= m; ++i)
	{
		b[x[i]] -= (double)cost[i] / gr[x[i]];
		a[x[i]][y[i]] += 1.0 / gr[x[i]];

		b[y[i]] -= (double)cost[i] / gr[y[i]];
		a[y[i]][x[i]] += 1.0/ gr[y[i]];
	}

	--n;

    gauss();

	printf("%lf\n", b[1]);
}

int main()
{
	freopen("tunel.in", "r", stdin);
	freopen("tunel.out", "w", stdout);

	citire();
	solve();

	return 0;
}