Cod sursa(job #113567)

Utilizator filipbFilip Cristian Buruiana filipb Data 10 decembrie 2007 20:25:24
Problema Tunelul groazei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 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 257

int N, M, pivot[NMax];
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, j, k, p;
    double factor;

    for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= N; j++)
            if (!pivot[j] && !cmp(D[j][i], 0))
            {
                pivot[j] = 1;
                break;
            }
            
        for (k = 1; k <= N; k++)
            if (!pivot[k] && !cmp(D[k][i], 0))
            {
                factor = D[j][i] / D[k][i];
                for (p = 1; p <= N+1; p++)
                    D[k][p] = D[k][p] * factor - D[j][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]++,
            cost += G[i][j].cost;
        D[i][i] -= sz;
        
        D[i][N+1] = -cost;
    }

    gauss();

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