Cod sursa(job #186041)

Utilizator andrei_infoMirestean Andrei andrei_info Data 26 aprilie 2008 17:01:56
Problema Tunelul groazei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <vector>

using namespace std;

#define MAX 300

double a[MAX][MAX], sol[MAX];
vector < pair<int,int> > G[MAX];
int N,M;

ifstream fin("tunel.in");
ofstream fout("tunel.out");

void build()
{
    for (int i = 1; i<N; i++)
    {
        a[i][i] = 1;
        int grad = G[i].size();
        int dist = 0;
        for ( vector < pair<int, int> > :: iterator it = G[i].begin(); it!= G[i].end(); it++)
        {
            dist+= it->second;
            a[i][ it->first] += - 1.0 / grad;
        }
        a[i][N+1] = (double) dist / grad;
    }
    a[N][N] = 1;
    a[N][N+1] = 0;
}

void gauss()
{
    for (int j = 1; j<N; j++)
    {
        int poz = -1;
        for (int i = j; i<=N; i++)
            if ( a[i][j] != 0 )
            {
                poz = i; break;
            }

        for ( int i = 1; i<=N+1; i++)
            swap(a[j][i], a[poz][i]);

        for (int i = j+1; i<=N; i++)
            if ( i != j )
            {
                double fact = -a[i][j] / a[j][j];

                for (int k = 1; k<=N+1; k++)
                    a[i][k] += fact * a[j][k];
            }
    }
}

void solve()
{
    sol[N] = 0;
    for ( int i= N-1; i>0; i--)
    {
        double sum = 0;
        for (int j = i + 1; j<=N; j++)
            sum += a[i][j]*sol[j];
        sol[i] = ( a[i][N+1] - sum ) / a[i][i];
    }
}


int main()
{
    fin>>N>>M;
    for ( ; M>0; M--)
    {
        int a,b,c;
        fin>>a>>b>>c;
        G[a].push_back( make_pair( b,c));
        G[b].push_back( make_pair( a,c));
    }

    build();
    gauss();
    solve();

    fout<<sol[1]<<"\n";

    return 0;
}