Cod sursa(job #631395)

Utilizator rootsroots1 roots Data 7 noiembrie 2011 22:10:08
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <cstring>

#define NMAX 256

using namespace std;

ifstream in;
ofstream out;

double g[NMAX][NMAX];
int cost[NMAX][NMAX];
int grad[NMAX];
double t[NMAX];

int main()
{
    int M,N,x,y;

    memset(grad,0,sizeof(grad));

    in.open("tunel.in");

    in>>N>>M;
    for(int i=1;i<=M;++i)
    {
        in>>x>>y;
        in>>cost[x][y];
        cost[y][x]=cost[x][y];
        ++grad[x];
        ++grad[y];
    }

    in.close();

    memset(t,0,sizeof(t));
    memset(g,0,sizeof(g));

    for(int i=1;i<N;++i)
    {
        g[i][i]=1;
        for(int j=1;j<=N;++j)
            if(cost[i][j])
            {
                if(j!=N) g[i][j]-=1/double(grad[i]);
                g[i][N]+=double(cost[i][j])/grad[i];
            }
    }

    for(int i=1;i<N;++i)
    {
        if(g[i][i]!=1)
        {
            for(int j=i+1;j<=N;++j) g[i][j]/=g[i][i];
            g[i][i]=1;
        }

        for(int r=i+1;r<N;++r)
            if(g[r][i]!=0)
            {
                for(int j=i+1;j<=N;++j)
                    g[r][j]-=g[r][i]*g[i][j];
                g[r][i]=0;
            }
    }

    for(int i=N-1;i>0;--i)
    {
        t[i]=g[i][N];
        for(int j=i+1;j<N;++j)
            t[i]-=t[j]*g[i][j];
    }

    out.open("tunel.out");

    out<<t[1]<<'\n';

    out.close();

    return 0;
}