Cod sursa(job #1952496)

Utilizator Bodo171Bogdan Pop Bodo171 Data 4 aprilie 2017 10:32:29
Problema Tunelul groazei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
#include <vector>
using namespace std;
const int nmax=257;
long double a[nmax][nmax];
long double rap,sz,len,ans;
long double eps=0.000000001;
vector< pair<int,int> > v[nmax];
int p[nmax];
int n,i,j,ind,m,aa,b,c,x;
void gauss()
{
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            if(fabs(a[i][j])>eps)
        {
            p[i]=j;
        }
        if(p[i]==0) continue;
        for(j=1;j<=n;j++)
            if(i!=j&&fabs(a[j][p[i]])>eps)
        {
            rap=a[j][p[i]]/a[i][p[i]];
            for(ind=1;ind<=n+1;ind++)
            {
                a[j][ind]-=a[i][ind]*rap;
            }
            a[j][p[i]]=0;
        }
    }
    for(i=1;i<=n;i++)
        if(p[i]==1)
          ans=a[i][n+1]/a[i][1];
}
int main()
{
    ifstream f("tunel.in");
    ofstream g("tunel.out");
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>aa>>b>>c;
        v[aa].push_back(make_pair(b,c));
        v[b].push_back(make_pair(aa,c));
    }
    for(i=1;i<=n;i++)
     {
         sz=v[i].size();
         for(j=0;j<v[i].size();j++)
         {
           x=v[i][j].first;len=v[i][j].second;
           a[i][x]+=1/sz;
           a[i][n+1]-=(1/sz)*len;
         }
         a[i][i]=-1;
     }
    for(i=1;i<=n;i++)
     a[i][n]=0;
    gauss();
    g<<fixed<<setprecision(6)<<ans;
    return 0;
}