Nu aveti permisiuni pentru a descarca fisierul grader_test1.in

Cod sursa(job #1268336)

Utilizator andreiiiiPopa Andrei andreiiii Data 20 noiembrie 2014 20:51:19
Problema Flux Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <algorithm>
#include <cstdio>
#include <cmath>

using namespace std;

const int Nmax = 105;
const double Eps = 1e-10;

double __A[Nmax][Nmax], X[Nmax], *A[Nmax];
int Cap[Nmax][Nmax], G[Nmax][Nmax];

void Gauss(const int N) {
    for (int i = 1, 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) swap(A[k], A[i]);

        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;
            }
        }
    }
}

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

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

    for (int i = 0; i < N; ++i)
        A[i] = __A[i];

    while (M--) {
        int x, y, cap;
        scanf("%d%d%d", &x, &y, &cap);
        x--; y--;

        G[x][y]++;
        G[y][x]++;
        Cap[x][y] = Cap[y][x] = (G[x][y] == 1 ? cap: min(Cap[x][y], cap));
    }

    for (int i = 1; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            A[i][i] += G[i][j];
            if (j != 0) A[i][j] -= G[i][j];
        }
    }
    A[N - 1][N] = 1;

    Gauss(N);

    double minp = 1e30;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < N; ++j)
            if (G[i][j])
                minp = min(minp, (double) Cap[i][j] / abs(X[j] - X[i]));

    double ans = 0;
    for (int i = 0; i < N - 1; ++i)
        ans += minp * (X[N - 1] - X[i]) * G[i][N - 1];

    printf("%.10f\n", ans);
}