Cod sursa(job #113923)

Utilizator devilkindSavin Tiberiu devilkind Data 11 decembrie 2007 21:46:35
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <stdio.h>
#include <vector>

using namespace std;
#define NMAX 256
#define pb push_back
#define sz size()

long int n,m,x,y,i,j,k,cost[NMAX][NMAX],c;
double a[NMAX][NMAX],liber[NMAX],ct;

vector<int> G[NMAX];

void GAUSS()
{

for (i=1;i<n;i++)
        for (j=1;j<n;j++)
                {
                if (i==j) continue;
                if (a[j][i]==0) continue;

                ct=a[i][i]/a[j][i];

                for (k=1;k<n;k++)
                        a[j][k]=a[j][k]*ct - a[i][k];
                liber[j]=liber[j]*ct - liber[i];
                }
}

int main()
{

        freopen("tunel.in","r",stdin);
        freopen("tunel.out","w",stdout);

        scanf("%ld %ld",&n,&m);

        for (i=1;i<=m;i++)
                {
                scanf("%ld %ld %ld",&x,&y,&c);
                G[x].pb(y);
                G[y].pb(x);
                cost[x][y]=c;
                cost[y][x]=c;
                }

        for (i=1;i<=n-1;i++)
                {
                k=G[i].sz;
                a[i][i]=-1;
                for (j=0;j<k;j++)
                        {
                        if (G[i][j]==n) {liber[i]+=(double) (cost[i][ G[i][j] ])/k;continue;}
                        a[i][ G[i][j] ]+=(double) 1/k;
                        liber[i]+=(double) (cost[i][ G[i][j]])/k;
                        }
                }

       /* for (i=1;i<n;i++, printf("\n") )
                for (j=1;j<n;j++)
                        printf("%.2lf ",a[i][j]);*/

        for (i=1;i<n;i++)
                liber[i]=-liber[i];

        GAUSS();

        printf("%.2lf",liber[1]/a[1][1]);
        return 0;
}