Cod sursa(job #181116)

Utilizator Stingacianu.VladStingacianu Vlad Stingacianu.Vlad Data 17 aprilie 2008 21:18:14
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 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];

 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;
		 }

	 // 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];
			 }
	 }

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

	 return 0;
 }