Cod sursa(job #1833736)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 23 decembrie 2016 00:38:04
Problema Flux Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>
using namespace std;

typedef long double f80;

const int SPQR = 105; // Ave Imperator, morituri te salutant!
const f80 EPS = 1e-7L;

vector<pair<int, int>> g[SPQR];
valarray<f80> gs[SPQR];
int far[SPQR];

inline bool eq(const f80 &a, const f80 &b) {
    return abs(a - b) < EPS; }

int getfar(int nod) {
    if (!far[nod]) return nod;
    else return (far[nod] = getfar(far[nod])); }

void join(int a, int b) {
    if (getfar(a) != getfar(b))
        far[getfar(a)] = b; }

int main(void) {
    ifstream fi("flux.in");
    ofstream fo("flux.out");
    int n, m, u, v, c;
    f80 rat, ant, aux;

    rat = -1.0L;
    ant = 0.0L;

    fi >> n >> m;
    for (int i = 0; i < m; ++i) {
        fi >> u >> v >> c;
        join(u, v);
        g[u].emplace_back(v, c);
        g[v].emplace_back(u, c); }

    if (getfar(1) != getfar(n)) {
        fo << "0.0\n";
        return 0; }

    for (int u = 1; u <= n; ++u)
        gs[u].resize(n + 2);

    gs[1][1] = gs[n][n] = gs[n][n + 1] = 1.0L;
    for (int u = 2; u < n; ++u) {
        gs[u][u] = g[u].size();
        for (auto v: g[u])
            gs[u][v.first]-= 1.0; }

    for (int i = 1; i <= n; ++i) if (!eq(gs[i][i], 0.0L)) {
        for (int j = 1; j <= n; ++j) if (i != j) {
            gs[j]-= gs[i] * (gs[j][i] / gs[i][i]); } }

    for (int i = 1; i <= n; ++i) if (!eq(gs[i][i], 0.0L)) {
        aux = gs[i][i];
        gs[i]/= aux; }

    for (int u = 1; u <= n; ++u)
        for (auto v: g[u])
            rat = max(rat, abs(gs[v.first][n + 1] - gs[u][n + 1]) / v.second);

    for (auto v: g[n])
        ant+= (gs[n][n + 1] - gs[v.first][n + 1]) / rat;

    cerr << rat << '\n';
    fo << setprecision(3) << fixed << abs(ant) << '\n';

    return 0; }

// :<