Cod sursa(job #672028)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 1 februarie 2012 14:08:57
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#define nmax 260

int n, m, gr[nmax];
double a[nmax][nmax], val[nmax];

void swap(double &a, double &b)
{
	double c=a;
	a=b;
	b=c;
}

int main()
{
	freopen("tunel.in","r",stdin);
	freopen("tunel.out","w",stdout);
	scanf("%d %d", &n, &m);
	int i, j, x, y, c, k;
	double t;
	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d", &x, &y, &c);
		gr[x]++;
		gr[y]++;
		a[x][y]=1;
		a[y][x]=1;
		a[x][n+1]-=c;
		a[y][n+1]-=c;
	}
	for (i=1; i<=n; i++)
		for (j=1; j<=n+1; j++) a[i][j]/=gr[i];
	for (i=1; i<n; i++) 
	{
		a[i][n]=0;
		a[i][i]=-1;
	}
	for (j=1; j<n; j++)
	{	
		for (i=j; i<=n; i++)
			if (a[i][j]) break;
		if (i!=j) 
			for (k=1; k<=n+1; k++)
				swap(a[i][k], a[j][k]);
		for (i=j+1; i<=n+1; i++) a[j][i]/=a[j][j];
		a[j][j]=1;
		for (i=j+1; i<n; i++)
			{
				for (k=j+1; k<=n+1; k++)
					a[i][k]-=a[i][j]*a[j][k];
				a[i][j]=0;
			}
	}
	for (i=n-1; i>0; i--)
		for (j=1; j<=n+1; j++)
			if (a[i][j])
			{
				val[j]=a[i][n+1];
				for (k=j+1; k<=n; k++) 
					val[j]-=val[k]*a[i][k];
				break;
			}
	printf("%.3lf\n",val[1]);
}