Cod sursa(job #113579)

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

using namespace std;

#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];

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

    for (i = 1; i <= N; i++)
    {            
        for (j = i+1; j <= N; j++)
        {
             factor = D[j][i] / D[i][i];
             for (k = i; k <= N; k++)
                  D[j][k] -= D[i][k] * factor;
             D[j][0] -= D[i][0] * factor;
        }
    }
    
}

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;
}