Cod sursa(job #1249633)

Utilizator geniucosOncescu Costin geniucos Data 27 octombrie 2014 11:30:01
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<cstdio>
#include<vector>

using namespace std;

int N, M;

double eps, A[260][260];

vector < pair < int , int > > v[260];

int main()
{

freopen ("tunel.in", "r", stdin);
freopen ("tunel.out", "w", stdout);

scanf ("%d %d", &N, &M);

for (int i=1; i<=M; i++)
{
    int X, Y, Z;
    scanf ("%d %d %d", &X, &Y, &Z);
    v [ X ] . push_back ( make_pair (Y, Z) );
    v [ Y ] . push_back ( make_pair (X, Z) );
}

for (int i=1; i<=N; i++)
    for (int j=1; j<=N+1; j++)
        A[i][j] = 0.0;

eps = 0.00000001;

for (int i=1; i<N; i++)
{
    int p = v[i].size();
    A[i][i] = 1.0;
    for (vector < pair < int , int > > :: iterator it = v[i].begin(); it != v[i].end(); it++)
        A[i][it->first] -= (double) 1 / p, A[i][N+1] += (double) it->second / p;
}
A[N][N] = 1.0;
A[N][N+1] = 0.0;


for (int i=1; i<=N; i++)
{
    int p = 0;
    for (int j = 1; j <= N + 1; j++)
        if ( A[i][j] <= -eps || A[i][j] >= eps)
        {
            p = j;
            break;
        }
    if (p == 0) continue;
    for (int j=1; j<=N; j++)
        if ( i != j && ( A[j][p] <= -eps || A[j][p] >= eps) )
        {
            /////int multesc pe i cu A[j][p]/A[i][p] si il scad
            double rap = A[j][p] / A[i][p];
            for (int k = 1; k <= N + 1; k++)
                A[j][k] = (double) A[j][k] - A[i][k] * rap;
        }
}

printf ("%.4lf\n", (double)A[1][N+1] / A[1][1]);

return 0;
}