Cod sursa(job #328031)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 30 iunie 2009 19:48:37
Problema Tunelul groazei Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>   
#include<math.h>

#define N 150
#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;
}