Cod sursa(job #193284)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 3 iunie 2008 15:17:12
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<stdio.h>
#include<math.h>
#define N 260
#define eps 0.0000001
int n,m;
double a[N][N];   
int b[N][N],v[N],g[N];
int main(){
	freopen("tunel.in","r",stdin);
	freopen("tunel.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i,j,k,x,y,z;   
	double 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;
		}
		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;
}