Cod sursa(job #2109042)

Utilizator refugiatBoni Daniel Stefan refugiat Data 19 ianuarie 2018 06:46:58
Problema Tunelul groazei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
#define EPS 1e-8
using namespace std;
ifstream si("tunel.in");
ofstream so("tunel.out");
vector<pair<int,int> >v[300];
long double x[300][300];
int main()
{
    int n,m;
    si>>n>>m;
    for(int i=1;i<=m;++i)
    {
        int a,b,c;
        si>>a>>b>>c;
        v[a].push_back(make_pair(b,c));
        v[b].push_back(make_pair(a,c));
    }
    for(int i=1;i<n;i++)
    {
        x[i][i]=-1;
        long double s=0;

        for(int j=0;j<v[i].size();j++){
            int now=v[i][j].first;
            int cost=v[i][j].second;

            x[i][now]+=(1.0/v[i].size());
            s+=(1.0*cost/v[i].size());
        }

        x[i][n]=-s;
    }

    for(int i=1;i<n;i++)
    {
        int l=i;
        while(l<n&&x[l][i]<EPS&&x[l][i]>-EPS)
            l++;

        if(l==n)
            continue;

        for(int j=1;j<=n;j++)
        {
            x[i][0]=x[l][j];
            x[l][j]=x[i][j];
            x[i][j]=x[i][0];
        }

        for(l=1;l<n;l++)
        {
            if(l==i)
                continue;
            if(x[l][i]>EPS||x[l][i]<-EPS)
            {
                long double aux=x[l][i]/x[i][i];
                for(int j=i;j<=n;j++)
                    x[l][j]-=(x[i][j]*aux);
            }
        }
    }

    long double ans=x[1][n]/x[1][1];

    so<<setprecision(6)<<fixed<<ans;
    return 0;
}