Cod sursa(job #2145344)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 27 februarie 2018 12:04:00
Problema Flux Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <bits/stdc++.h>
#define MAXN 200

int n, m;
std::pair<int, double> G[1 + MAXN][1 + MAXN];
const double EPS = 0.0000001;
inline double absolut(double a){return a > 0 ? a : -a;}
double a[1 + MAXN][1 + MAXN + 1], v[1 + MAXN];
bool seen[1 + MAXN];

void dfs(int node, int fth){
    seen[node] = 1;
    for(int i = 1; i <= n; i++) if(G[node][i].first && !seen[i]) dfs(i, node);
}
int main(){
    FILE*fi,*fo;
    fi = fopen("flux.in","r");
    fo = fopen("flux.out","w");

    fscanf(fi,"%d%d", &n, &m);
    for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) G[i][j].second = 1000000000000000.0;
    for(int i = 1; i <= m; i++){
        int a, b; double c; fscanf(fi,"%d%d%lf", &a, &b, &c);
        G[a][b].first++, G[b][a].first++;
        G[a][b].second = std::min(G[a][b].second, c), G[b][a].second = std::min(G[b][a].second, c);
    }
    dfs(1, 0);if(!seen[n]){fprintf(fo,"0.00000"); return 0;}
    a[1][1] = 1, a[1][n + 1] = 0;
    for(int i = 2; i <= n; i++)
        for(int j = 1; j <= n; j++) if(j != i) a[i][j] = G[i][j].first, a[i][i] -= G[i][j].first;
    a[n][n + 1] = -1;

    m = n;
    int i, j, k;
    i = j = 1;
    while(i <= n && j <= m){
        k = i;
        while(k <= n && absolut(a[k][j]) < EPS) k++;
        if(k != n + 1){
            if(k != i) for(int p = 1; p <= m + 1; p++) std::swap(a[i][p], a[k][p]);
            for(int p = j + 1; p <= m + 1; p++) a[i][p] /= a[i][j];
            a[i][j] = 1.0;
            for(int p = i + 1; p <= n; p++){
                for(int q = j + 1; q <= m + 1; q++) a[p][q] -= a[p][j] * a[i][q];
                a[p][j] = 0.0;
            }
            i++;
        }
        j++;
    }

    for(int i = n; i >= 1; i--)
        for(int j = 1; j <= m + 1; j++)
            if(absolut(a[i][j]) > EPS){
                v[j] = a[i][m + 1];
                for(int k = j + 1; k <= m; k++) v[j] -= v[k] * a[i][k];
                break;
            }

    double amp = 1000000000000000.0;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n; j++)
            if(j != i && G[i][j].first && v[j] > v[i]) amp = std::min(amp, G[i][j].second / (v[j] - v[i]));
    fprintf(fo,"%f", amp);

    return 0;
}