Cod sursa(job #116208)

Utilizator sealTudose Vlad seal Data 17 decembrie 2007 22:43:47
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>
#include<string.h>
#define Nm 256
int M[Nm][Nm],D[Nm],S[Nm],n;
double A[Nm][Nm+1];

void read()
{
    int m,x,y,c;

    freopen("tunel.in","r",stdin);
    scanf("%d%d",&n,&m);
    while(m--)
    {
        scanf("%d%d%d",&x,&y,&c);
        x=n-x+1; y=n-y+1;
        ++D[x]; ++D[y];
        S[x]+=c; S[y]+=c;
        ++M[x][y]; ++M[y][x];
    }
}

void add_line(int a, int b, double x)
{
    int j;

    for(j=1;j<=n+1;++j)
        A[a][j]+=A[b][j]*x;
}

void solve()
{
    int i,j;
    double Aux[Nm+1];

    A[1][1]=1;
    for(i=2;i<=n;++i)
    {
        for(j=1;j<=n;++j)
            A[i][j]=M[i][j]/(double)D[i];
        A[i][i]=-1;
        A[i][n+1]=-S[i]/(double)D[i];
    }

    for(j=1;j<n;++j)
    {
        for(i=j;i<=n && !A[i][j];++i);
        memcpy(Aux,A[i],sizeof(A[i]));
        memcpy(A[i],A[j],sizeof(A[i]));
        memcpy(A[j],Aux,sizeof(A[i]));

        for(i=j+1;i<=n;++i)
            add_line(i,j,-A[i][j]/A[j][j]);
    }
}

void write()
{
    freopen("tunel.out","w",stdout);
    printf("%lf\n",A[n][n+1]/A[n][n]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}