Cod sursa(job #113939)

Utilizator devilkindSavin Tiberiu devilkind Data 11 decembrie 2007 22:12:17
Problema Tunelul groazei Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#include <vector>

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

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

vector< pair<int,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];

                x=i;if (x>j) x=j;
                for (k=x;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( mp(y,c) );
                G[y].pb( mp(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].first==n) {liber[i]+=(double) G[i][j].second/k;continue;}
                        a[i][ G[i][j].first ]+=(double) 1/k;
                        liber[i]+=(double) G[i][j].second/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("%.3lf",liber[1]/a[1][1]);
        return 0;
}