Cod sursa(job #328034)

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

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