Cod sursa(job #171754)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 4 aprilie 2008 23:58:42
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <math.h>

#define maxn 256
#define db double
#define eps 0.0000001

int n,m;
db a[maxn][maxn];
int b[maxn][maxn];
int v[maxn], g[maxn];

void print()
{
	int i,j;

	for (i=1; i<n; i++)
	{
		for (j=1; j<=n; j++) printf("%lf ",a[i][j]);
		printf("\n");
	}
	printf("\n");
}

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

	scanf("%d %d ",&n,&m);

	int i, j, k;
	int x, y, z;
	db aux;

	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d ",&x, &y, &z);
		v[x] += z, v[y] += z;
		b[x][y]++, b[y][x]++;
		g[x]++, g[y]++;
	}

	for (i=1; i<=n; i++)
		if (g[i]) 
		{
			for (j=1; j<=n; j++) a[i][j] = 1.0*b[i][j] / g[i];
			a[i][i] -= 1;
			a[i][n] = 1.0*v[i]/g[i];
			a[i][n] *= -1;
		}

//	print();

	// Gauss 
	
	for (i=1; i<n; i++)
	{
		if (fabs(a[i][i])<eps) 
			for (j=i+1; j<n; j++)
				if (fabs(a[j][i])>eps)
					for (k=1; k<=n; k++) aux = a[i][k], a[i][k] = a[j][k], a[j][k] = aux;

		aux = 1/a[i][i];
		for (j=1; j<=n; j++) a[i][j] *= aux;

		for (j=1; j<n; j++)
			if (i != j)
			{
				aux = a[j][i];
				for (k=i; k<=n; k++) a[j][k] = a[j][k]*a[i][i] - aux*a[i][k];
			}
//		print();
	}

	printf("%lf\n", 1.0*a[1][n]/a[1][1]);

	return 0;
}