Cod sursa(job #106439)

Utilizator astronomyAirinei Adrian astronomy Data 18 noiembrie 2007 17:11:19
Problema Tunelul groazei Scor Ascuns
Compilator cpp Status done
Runda Marime 1.26 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

#define MAXN 301

double E[MAXN][MAXN];
double X[MAXN];
int N, M, C[MAXN][MAXN], g[MAXN];

void solve(void)
{
    int i, j, k;
    double coef, val;

    for(i = 1; i < N; i++)
    {
        for(j = i+1; j < N; j++)
         for(coef = -E[j][i]/E[i][i], k = i; k <= N; k++)
            E[j][k] += coef*E[i][k];
    }
    for(i = N-1; i >= 1; i--)
    {
        for(val = E[i][N], j = i+1; j < N; j++)
            val = val - E[i][j]*X[j];
        X[i] = val / E[i][i];
    }
}

void read_data(void)
{
    int i, j, k, a, b, c;
    
    scanf("%d %d\n", &N, &M);

    for(i = 1; i <= M; i++)
        scanf("%d %d %d\n", &a, &b, &c),
        C[a][b] += c, C[b][a] += c, g[b]++, g[a]++;

    for(i = 1; i < N; i++)
    {
        for(E[i][i] = -1.0, j = 1; j < N; j++)
         if(j != i && C[i][j] > 0)
            E[i][j] = (double)1/g[i];
        for(j = 1; j <= N; j++)
            E[i][N] -= 1.0/g[i]*C[i][j];
    }
}

void write_data(void)
{
    printf("%.3lf\n", X[1]);
}

int main(void)
{
    freopen("tunel.in", "rt", stdin);
    freopen("tunel.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}