Cod sursa(job #1412576)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 1 aprilie 2015 12:54:47
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
const int NMAX=256;
vector<pair<int, int> > g[NMAX];
int x, y, c, n, m;
double coef, a[NMAX][NMAX], sol[NMAX];

void gauss()
{
    double x;
    int i;
    for(int j=1; j<=n; ++j)
    {
        for(i=j; i<=n; ++i)
            if(a[i][j])
                break;

        for(int k=1; k<=n; ++k)
            swap(a[i][k], a[j][k]);
        swap(sol[i], sol[j]);

        for(i=1; i<=n; ++i)

            if(i!=j)
            {


                x=a[i][j]/a[j][j];

                for(int k=1; k<=n; ++k)
                    a[i][k]-=x*a[j][k];
                sol[i]-=x*sol[j];
            }
    }

}

int main()
{
    ifstream in("tunel.in");
    ofstream out("tunel.out");
    in>>n>>m;
    for(int i=1; i<=m; ++i)
    {
        in>>x>>y>>c;
        g[x].push_back(make_pair(y, c));
        g[y].push_back(make_pair(x, c));
    }

    for(int i=1; i<n; ++i)
    {
        a[i][i]=1;
        coef=(double)1/g[i].size();
        for(int j=0; j<g[i].size(); ++j)
        {
            a[i][g[i][j].first]-=coef;
            sol[i]+=coef*g[i][j].second;
        }
    }
    a[n][n]=1;
    gauss();
    out<<setprecision(4)<<fixed<<sol[1]/a[1][1];
    return 0;
}