Cod sursa(job #2119216)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 31 ianuarie 2018 20:08:05
Problema Flux Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <bits/stdc++.h>
#define eps 1e-8
#define inf 1e10

using namespace std;

int n, m;
vector<int> v[101];
int viz[101];
double cost[101][101];
double mat[101][101];
double fin[101][101];
double x[101];

void gauss()
{
    int lc = 1, cc = 1;
    while(lc < n && cc < n)
    {
        if(abs(mat[lc][cc]) < eps)
        {
            int k;
            for(k = lc + 1; k < n && abs(mat[k][cc]) < eps; k++);
            if(k == n)
            {
                cc++;
                continue;
            }
            for(int i = cc; i <= n; i++)
                swap(mat[lc][i], mat[k][i]);
        }
        for(int i = cc + 1; i <= n; i++)
            mat[lc][i] /= mat[lc][cc];
        mat[lc][cc] = 1;
        for(int i = lc + 1; i < n; i++)
        {
            if(abs(mat[i][cc]) < eps) continue;
            for(int j = cc + 1; j <= n; j++)
                mat[i][j] -= mat[lc][j] * mat[i][cc];
            mat[i][cc] = 0;
        }
        lc++; cc++;
    }
    for(int i = n - 1; i > 0; i--)
    {
        int j;
        for(j = 1; j <= n && abs(mat[i][j]) < eps; j++);
        if(j == n + 1) continue;
        double sum = 0;
        for(int k = j + 1; k < n; k++)
            sum += x[k] * mat[i][k];
        x[j] = mat[j][n] - sum;
    }
}

void dfs(int nod)
{
    if(viz[nod] == 1) return;
    viz[nod] = 1;
    for(int i = 0; i < v[nod].size(); i++)
    {
        fin[nod][v[nod][i]] = x[v[nod][i]] - x[nod];
        dfs(v[nod][i]);
    }
}

int main()
{
    freopen("flux.in", "r", stdin);
    freopen("flux.out", "w", stdout);
    int a, b, c;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            cost[i][j] = inf;
    for(int i = 0; i < m; i++)
    {
        scanf("%d%d%d", &a, &b, &c);
        a--; b--;
        if(cost[a][b] > c)
            cost[a][b] = cost[b][a] = c;
        mat[a][a]++;
        mat[b][b]++;
        mat[a][b]--;
        mat[b][a]--;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    mat[n - 1][n] = 1;
    gauss();
    dfs(0);
    if(viz[n - 1] == 0)
        printf("0.000");
    else
    {
        double sol = inf;
        for(int i = 0; i < n; i++)
            for(int j = 0; j < v[i].size(); j++)
                if(fin[i][v[i][j]] > 0)
                    sol = min(sol, cost[i][v[i][j]] / fin[i][v[i][j]]);
        printf("%.3f", sol);
    }
    return 0;
}