Cod sursa(job #504583)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 28 noiembrie 2010 10:39:14
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define NMAX 265
#define mp make_pair
#define FOR(i, v) for(vector<pair<int, int> > ::iterator i = v.begin(); i != v.end(); ++i)
vector< pair< int ,int > > G[NMAX];
int grad[NMAX];
double a[NMAX][NMAX];
int n, m;
void gauss(){
    for(int i = 1; i <= n; ++i){
        for(int k = i+1; k <= n; ++k)
            for(int j = n+1;j >= i; --j)
                if(a[k][i] != 0) a[k][j] -=  a[k][i] / a[i][i] * a[i][j];
    }

    for(int j = n; j; --j){
       if(a[j][n+1] != 0) a[j][n+1] /= a[j][j];
        a[j][j] = 1;
        for(int i = j-1; i; --i){
            a[i][n+1] -= a[i][j] * a[j][n+1];
            a[i][j] = 0;
        }
    }
}

void build(){
    for(int i = 1; i < n; ++i){
        a[i][i] = grad[i];
        FOR(it, G[i]){
            a[i][it->first] += -1;
            a[i][n+1] += it->second;
        }
    }
    a[n][n] = 1; a[n][n+1] = 0;
}
int main(){
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; ++i){
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        grad[x]++;
        grad[y]++;
        G[x].push_back(mp(y,c));
        G[y].push_back(mp(x,c));
    }
    build();
    gauss();

    printf("%lf\n" ,a[1][n+1]);
    return 0;
}