Cod sursa(job #1284453)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 6 decembrie 2014 15:43:54
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define x first
#define y second
#define NMAX 257

using namespace std;

vector< pair < int, int > > v[NMAX];
double a[NMAX][NMAX], b[NMAX];
int n, m;

void Gauss(){
    for(int j = 1; j <= n; ++j) {
        int i;
        for(i = j; i <= n; ++i)
            if(a[i][j])
                break;
        for(int k = 1; k <= n; ++k)
            swap(a[j][k], a[i][k]);
        swap(b[i], b[j]);
        for(int i = 1; i <= n; ++i)
            if(i != j){
                double x = -a[i][j]/a[j][j];
                for(int k = 1; k <= n; ++k)
                    a[i][k] += x * a[j][k];
                b[i] += x * b[j];
            }
    }
}

int main() {
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 0; i < m; ++i) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        v[a].push_back(make_pair(b, c));
        v[b].push_back(make_pair(a, c));
    }
    for (int i = 1; i < n; ++i) {
        a[i][i] = 1;
        double coef = (double)1 / ((int)v[i].size());
        for(vector < pair < int, int > >::iterator it = v[i].begin(); it != v[i].end(); ++it){
            a[i][it->x] -= coef;
            b[i] += coef * it->y;
        }
    }
    a[n][n] = 1;
    b[n] = 0;
    Gauss();
    printf("%.4f\n", (double)b[1] / a[1][1]);
    return 0;
}