Cod sursa(job #1795201)

Utilizator ade_tomiEnache Adelina ade_tomi Data 2 noiembrie 2016 08:35:38
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#define eps 0.0000001
#define NMAX 260
#include <iomanip>
#include <vector>
using namespace std;
double a[NMAX][NMAX];


bool zero (double x)
{
    if (x > -eps && x < eps)
        return 0;
    return 1;
}
int n, m;
vector <int> v[NMAX];
vector <int> c[NMAX];
int main ()
{
    int x, y, cost;
    ifstream cin ("tunel.in");
    ofstream cout ("tunel.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);
        c[x].push_back(cost);
        c[y].push_back(cost);
    }
    for (int i = 1; i <= n; i++)
    {
        int sum = 0;
        for (int j = 0; j < v[i].size(); j++)
        {
            a[i][v[i][j]] = 1.0;
            sum += -c[i][j];
        }
        a[i][i] = v[i].size();
        a[i][i] = - a[i][i];
        a[i][n + 1] = sum;
    }
    int l = 1, c = 1;
   /* for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
            cout << a[i][j] << " " ;
         cout << "\n";
    }*/
    while (l <= n && c <= n)
    {
        if (zero(a[l][c]) == 0)
        {
            for (int i = l + 1; i <= n; i++)
            {
                if (zero(a[i][c]) != 0)
                {
                    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 = 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++;

    }
    cout << setprecision(4) << fixed; 
    cout << setprecision(4) << a[1][n + 1] * 1.0 / a[1][1];
    return 0;
}