Cod sursa(job #113575)

Utilizator filipbFilip Cristian Buruiana filipb Data 10 decembrie 2007 20:35:34
Problema Tunelul groazei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define EPS 1e-12
#define pb push_back
#define mp make_pair
#define nod first
#define cost second
#define PII pair<int, int>
#define NMax 256

int N, M;
vector< PII > G[NMax];
double D[NMax][NMax], X[NMax];

int cmp(double a, double b)
{
    if (a >= b && a-b < EPS)
        return 1;
    if (b > a && b-a < EPS)
        return 1;
    return 0;
}

void gauss(void)
{
    int i, k, p;
    double factor;

    for (i = 1; i <= N; i++)
    {            
        for (k = i+1; k <= N; k++)
            if (!cmp(D[k][i], 0))
            {
                factor = D[i][i] / D[k][i];
                for (p = i; p <= N; p++)
                    D[k][p] = D[k][p] * factor - D[i][p];
                D[k][0] = D[k][0] * factor - D[i][0];
            }            
    }
    
}

int main(void)
{
    int i, j, cost, sz;
    
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (; M; M--)
    {
        scanf("%d %d %d", &i, &j, &cost);
        G[i].pb( mp(j, cost) );
        G[j].pb( mp(i, cost) );
    }
    
    for (i = 1; i < N; i++)
    {
        sz = G[i].size();
        cost = 0;
        for (j = 0; j < sz; j++)
            D[i][G[i][j].nod] += (double)1/sz,
            cost += G[i][j].cost;
        D[i][i] -= 1.0;
        
        D[i][0] = -(double)cost/sz;
    }
    D[N][N] = 1.0;

    gauss();

    for (i = N; i >= 1; i--)
    {
        for (j = i+1; j <= N; j++)
            D[i][0] -= D[i][j] * X[j];
        X[i] = D[i][0] / D[i][i];
    }
    
    printf("%.3lf\n", D[1][0] / D[1][1]);
    
    return 0;
}