Cod sursa(job #1264504)

Utilizator dariusdariusMarian Darius dariusdarius Data 15 noiembrie 2014 21:34:37
Problema Flux Scor 32
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <cmath>

#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
const int MAX_N = 105;
const double eps = 1.e-5;

vector<int> graph[MAX_N];
int line[MAX_N];
int capacity[MAX_N][MAX_N];
int x[MAX_N], y[MAX_N], c[MAX_N];
int edges[MAX_N][MAX_N];
double coef[MAX_N][MAX_N];
double flux[MAX_N];

int main() {
    ifstream fin("flux.in");
    ofstream fout("flux.out");
    int n, m;
    fin >> n >> m;
    for (int i = 1; i <= m; ++ i) {
        fin >> x[i] >> y[i] >> c[i];
        ++ edges[x[i]][y[i]];
        ++ edges[y[i]][x[i]];
        graph[x[i]].push_back(y[i]);
        graph[y[i]].push_back(x[i]);
    }
    for (int i = 2; i < n; ++ i) {
        for (vector<int> :: iterator it = graph[i].begin(); it != graph[i].end(); ++ it) {
            coef[i][*it] += 1.0;
        }
        coef[i][i] = -1.0 * graph[i].size();
    }
    coef[1][1] = 1;
    coef[n][n] = coef[n][n + 1] = 1.0;
    int i = 1, j = 1;
    while (i <= n) {
        int last = 0;
        for (int k = j; k <= n; ++ k) {
            if (fabs(coef[k][i]) >= eps) {
                last = k;
                break;
            }
        }
        if (last == 0) {
            line[i] = -1;
            ++ i;
            continue;
        }
        for (int k = 1; k <= n + 1; ++ k) {
            swap(coef[j][k], coef[last][k]);
        }
        for (int k = j + 1; k <= n; ++ k) {
            if (fabs(coef[k][i]) >= eps) {
                double raport = coef[k][i] / coef[j][i];
                for (int p = 1; p <= n + 1; ++ p) {
                    coef[k][p] = coef[k][p] - coef[j][p] * raport;
                }
            }
        }
        line[i] = j;
        ++ i; ++ j;
    }
    for (int i = n; i >= 2; -- i) {
        if (line[i] != -1) {
            for (int p = 1; p <= n; ++ p) {
                if (i != p) {
                    coef[line[i]][n + 1] -= coef[line[i]][p] * flux[p];
                }
            }
            flux[i] = coef[line[i]][n + 1] / coef[line[i]][i];
        }
    }
    double answer = 0, p = 1.e9;
    for (int i = 1; i <= m; ++ i) {
        p = min(p, fabs(c[i] / (flux[y[i]] - flux[x[i]])));
    }
    sort(graph[n].begin(), graph[n].end());
    graph[n].erase(unique(graph[n].begin(), graph[n].end()), graph[n].end());
    for (vector<int> :: iterator it = graph[n].begin(); it != graph[n].end(); ++ it) {
        answer += p * (flux[n] - flux[*it]);
    }

    fout << answer << "\n";
    return 0;
}