Cod sursa(job #1083141)

Utilizator crisbodnarCristian Bodnar crisbodnar Data 15 ianuarie 2014 17:39:07
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

const int Nmax = 260;

int N, M, NR[Nmax][Nmax], GR[Nmax], CST[Nmax][Nmax];
double SOL[Nmax], A[Nmax][Nmax];

int main()
{
    fin >> N >> M;
    for(int i = 1; i <= M; i++)
    {
        int x, y, c;
        fin >> x >> y >> c;
        NR[x][y]++; NR[y][x]++;
        GR[x]++; GR[y]++;
        CST[x][y] += c; CST[y][x] += c;
    }

    for(int i = 1; i < N; i++)
    {
        A[i][i] = GR[i];
        for(int j = 1; j <= N; j++)
            if(CST[i][j])
            {
                if(j != N) A[i][j] -= NR[i][j];
                A[i][N] += CST[i][j];
            }
        for(int j=1; j <= N; j++)
            A[i][j] /= GR[i];
    }

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

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

    for(int i = N - 1; i; i--)
    {
        SOL[i] = A[i][N];
        for(int j = i + 1; j < N; j++)
            SOL[i] -= SOL[j] * A[i][j];
    }
    fout.precision(5);
    fout<<fixed<<SOL[1];
    return 0;
}