Cod sursa(job #1065844)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 23 decembrie 2013 19:02:02
Problema Flux Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.27 kb
#include <stdio.h>

bool adj[111][111];
int cmin[111][111];
double res[111], M[111][111];

const int EPS = 0.00000001;

void add(int xx, int yy, int cc) {
    if (adj[xx][yy] == 0) {
        adj[xx][yy] = 1;
        cmin[xx][yy] = cc;
    }
    if (cc < cmin[xx][yy])
        cmin[xx][yy] = cc;
    if (xx != 1) {
        ++M[xx][xx];
        --M[xx][yy];
    }
}

void swap(double &A, double &B) {
    double tmp = A;
    A = B;
    B = tmp;
}

double abs(double X) {
    return X > 0 ? X : -X;
}

void eliminareGaozara(int N, int m) {
    int i = 1, j = 1, k;
    while (i <= N && j <= m) {
        for (k = i; k <= N; ++k)
            if (!(abs(M[k][j]) <= EPS))
                break;
        if (k == N + 1) {
            ++j;
            continue;
        }
        for (int c = 1; c <= m + 1; ++c)
            swap(M[i][c], M[k][c]);
        double ret = M[i][j];
        for (k = 1; k <= m + 1; ++k)
            M[i][k] /= ret;
        for (k = i + 1; k <= N; ++k) {
            ret = M[k][j];
            for (int c = 1; c <= m + 1; ++c)
                M[k][c] = M[k][c] - ret * M[i][c];
        }
        ++i; ++j;
    }
    for (i = N; i >= 1; --i) {
        for (j = 1; j <= m + 1; ++j)
            if (!(abs(M[i][j]) <= EPS))
                break;
        if (j <= m) {
            res[i] = M[i][m + 1];
            for (int k = m; k > j; --k)
                res[i] -= res[k] * M[i][k];
        }
    }
}

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

    int N, m;
    scanf("%d%d", &N, &m);
    for (int i = 1; i <= m; ++i) {
        int xx, yy, cc;
        scanf("%d%d%d", &xx, &yy, &cc);
        add(xx, yy, cc);
        add(yy, xx, cc);
    }
    M[N][m + 1] = 1;

    eliminareGaozara(N, m);
    return 0;

    double scalar = 1 << 30;
    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= N; ++j)
            if (adj[i][j] && res[j] - res[i] > EPS)
                if (scalar > (double)cmin[i][j] / (res[j] - res[i]))
                    scalar = (double)cmin[i][j] / (res[j] - res[i]);
    double sol = 0;
    for (int i = 1; i <= N; ++i)
        if (adj[i][N])
            sol += (res[N] - res[i]) * scalar;
    printf("%.3lf", sol);
    return 0;
}