Cod sursa(job #1552767)

Utilizator algebristulFilip Berila algebristul Data 18 decembrie 2015 17:18:33
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>

using namespace std;

const int NMAX = 300;
const double EPS = 1e-4;
double M[NMAX][NMAX];
int n, m;

int main() {
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);

    scanf("%d %d", &n, &m);

    for (int i = 0, x, y, c; i < m; i++) {
        scanf("%d %d %d", &x, &y, &c);
        M[x][y]++; M[x][n+1] -= c;
        M[y][x]++; M[y][n+1] -= c;
    }

    for (int i = 1; i <= n; i++) {
        int deg = 0;
        for (int j = 1; j <= n; j++) {
            deg += M[i][j] > 0;
        }

        for (int j = 1; j <= n+1; j++) {
            M[i][j] /= 1. * deg;
        }

        M[i][i] = -1;
    }

    for (int i = 1; i <= n+1; i++) {
        M[i][n] = 0;
        M[n][i] = 0;
    }


    int x, y;
    x = 1;
    y = 1;

    while (x < n && y <= n) {
        int i, j;
        for (i = x; i <= n && (M[i][y] >= -EPS && M[i][y] <= EPS); i++);

        if (i == n+1) {
            y++;
            continue;
        }

        for (j = 1; j <= n + 1; j++) {
            double aux = M[x][j];
            M[x][j] = M[i][j];
            M[i][j] = aux;
        }

        for (i = 1; i <= n; i++) {
            if (i == x)
                continue;

            double p = M[i][y] / M[x][y];

            for (j = y; j <= n + 1; j++) {
                M[i][j] -= p * M[x][j];
            }
        }

        x++;
        y++;
    }

    double ans = M[1][n + 1] / M[1][1];

    printf("%.3lf\n", ans);

    return 0;
}