Cod sursa(job #832030)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 9 decembrie 2012 17:35:29
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <iomanip>
#include <vector>
#include <utility>
#define eps 0.000001
using namespace std;
vector<pair<int,int> >v[300];
int n, k, m, i, j, l, c, x, y, sum, vec;
double a[300][300], sol;
int main()
{
    ifstream fi("tunel.in");
    ofstream fo("tunel.out");
    fi >> n >> m;
    for(i = 1; i <= m; i++)
    {
        fi >> x >> y >> c;
        v[x].push_back(make_pair(y,c));
        v[y].push_back(make_pair(x,c));
    }
    for(i = 1; i <= n; i++)
    {
        vec = v[i].size();
        if(i == 1) vec++;
        sum = 0;
        for(j = 0; j < v[i].size(); j++)
        {
            if(v[i][j].first == n)
            {
                vec--;
                continue;
            }
            a[i][v[i][j].first] += -1;
            sum += v[i][j].second;
        }
        a[i][i] = vec;
        a[i][n+1] = sum;
    }
    i = 1; j = 1;
    m = n;
    while(i <= n and j <= m)
    {
        for(k = i; k <= n; k++)
            if(a[k][j] < -eps or a[k][j] > eps) break;
        if(k == n+1)
        {
            j++;
            continue;
        }
        if(k != i)
            for(l = 1; l <= m+1; l++) swap(a[i][l], a[k][l]);
        for(l = j+1; l <= m+1; l++)
            a[i][l] = (double)a[i][l]/a[i][j];
        a[i][j] = 1;
        for(l = i+1; l <= n; l++)
        {
            for(c = j+1; c <= m+1; c++)
                a[l][c] -= (double)a[i][c]*a[l][j];
            a[l][j] = 0;
        }
        i++; j++;
    }
    sol = (double)a[n][m+1]/a[n][m];
    fo << setprecision(9) << fixed;
    fo << sol << "\n";
    return 0;
}