Cod sursa(job #113562)

Utilizator filipbFilip Cristian Buruiana filipb Data 10 decembrie 2007 20:08:02
Problema Tunelul groazei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <math.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 257

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

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

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 = 1; p <= N+1; p++)
                    D[k][p] = D[k][p] * factor - D[i][p];
            }            
    }
    
}

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

    D[1][1] = 1.0;
    
    for (i = 2; 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);
        
        D[i][N+1] = (double)(-cost)/sz;        
    }

    gauss();

    printf("%.2lf\n", D[N][N+1] / D[N][N]);
    
    return 0;
}