Cod sursa(job #1795244)

Utilizator ade_tomiEnache Adelina ade_tomi Data 2 noiembrie 2016 09:37:18
Problema Flux Scor 84
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
#define NMAX 103
#define eps 1e-7
using namespace std;
int n, m;
double a[NMAX][NMAX], sol[NMAX];
bool zero (double x)
{
    if (x >-eps && x < eps)
        return 0;
    return 1;
}
vector <int> v[NMAX], co[NMAX];
int main ()
{
    int x, y, cost;
    ifstream cin ("flux.in");
    ofstream cout ("flux.out");
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        cin >> x >> y >> cost;
        v[x].push_back(y);
        v[y].push_back(x);
        co[x].push_back (cost);
        co[y].push_back (cost);
    }
    for (int i = 2; i < n; i++)
    {
        a[i][i] = v[i].size();
        for (int j = 0; j < v[i].size(); j++)
            a[i][v[i][j]] -= 1.0; 
    }
    a[1][1] = a[n][n] = a[n][n + 1] = 1.0;
    int l = 1,  c = 1;
    while (l <= n && c <= n)
    {
        if (zero (a[l][c]) == 0)
        {
            for (int i = l + 1; i <= n; i++)
                if (zero(a[i][c]))
                {
                    swap (a[i],a[l]);
                    break;
                }
        }
        if (zero(a[l][c]) == 0)
        {
            c++;
            continue;
        }
        for (int i = 1; i <= n; i++)
        {
            if (i == l)
                continue;
            double k = 1.0 * a[i][c] / a[l][c];
            for (int j = 1; j <= n + 1; j++)
                a[i][j] -= 1.0 * k * a[l][j];
        }
        l++;
        c++;
    }
    
    for (int i = 1; i <= n; i++)
        sol[i] = a[i][n + 1]* 1.0 / a[i][i]; 
    double kp = 0;
    for (int i = 1; i <= n; i++)
    {
        
        for (int j = 0 ;j < v[i].size(); j++)
        {
            kp = max (kp, (sol[v[i][j]] - sol[i])* 1.0 / co[i][j]);
        }
        
    }
    double  s = 0;
    for (int j = 0; j < v[n].size(); j++)
            s += 1.0 * (sol[n] - sol[v[n][j]])/kp;
   // cout << kp;
   cout << setprecision(4) << fixed;
    cout << s;
    return 0;

}