Cod sursa(job #1265704)

Utilizator andreiiiiPopa Andrei andreiiii Data 17 noiembrie 2014 17:05:56
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>

using namespace std;

const int Nmax = 256;
const double Eps = 1e-12;

vector<int> G[Nmax];

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

    int N, M;
    scanf("%d%d", &N, &M);

    vector<vector<double>> A(N, vector<double>(N + 1, 0));
    vector<double> X(N);

    while (M--) {
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        G[x - 1].push_back(y - 1);
        G[y - 1].push_back(x - 1);
        A[x - 1][N] -= c;
        A[y - 1][N] -= c;
    }

    for (int i = 0; i < N; ++i) {
        A[i][i] = -1;
        A[i][N] /= G[i].size();
        for (int p: G[i])
            A[i][p] += 1.0D / G[i].size();
    }

    for (int i = 0, j = 0; i < N && j < N; ) {
        int k;
        for (k = i; k < N && abs(A[k][j]) < Eps; ++k);

        if (k == N) {
            ++j;
            continue;
        }
        if (k != i) A[i].swap(A[k]);

        for (int k = j + 1; k <= N; ++k)
            A[i][k] /= A[i][j];
        A[i][j] = 1;

        for (int k = i + 1; k < N; ++k) {
            for (int p = j + 1; p <= N; ++p)
                A[k][p] -= A[i][p] * A[k][j];
            A[k][j] = 0;
        }
        i++;
        j++;
    }

    for (int i = N - 1; i >= 0; --i) {
        for (int j = 0; j <= N; ++j) {
            if (abs(A[i][j]) > Eps) {
                X[j] = A[i][N];
                for (int k = j + 1; k < N; ++k)
                    X[j] -= A[i][k] * X[k];
                break;
            }
        }
    }

    printf("%.12f\n", X[0]);
}