Cod sursa(job #2027323)

Utilizator livliviLivia Magureanu livlivi Data 25 septembrie 2017 21:55:32
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<fstream>
#include<vector>
#include<iomanip>
#include<utility>
#define N 255
#define EPS 1e-8
using namespace std;

vector<pair<int,int> > vecin[N+1];
double A[N+1][N+1];

ifstream fin("tunel.in");
ofstream fout("tunel.out");

int main(){
    int n,m,i,j;

    fin>>n>>m;

    for(i=1;i<=m;i++){
        int a,b,c;

        fin>>a>>b>>c;
        vecin[a].push_back(make_pair(b,c));
        vecin[b].push_back(make_pair(a,c));
    }

    for(i=1;i<n;i++){
        A[i][i]=-1;
        double s=0;

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

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

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

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

        if (l==n) continue;

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

        for(l=1;l<n;l++){
            if (l==i) continue;
            if (A[l][i]>EPS ||A[l][i]<-EPS){
                double aux=A[l][i]/A[i][i];

                for(j=i;j<=n;j++)
                    A[l][j]-=(A[i][j]*aux);
            }
        }
    }

    double ans=A[1][n]/A[1][1];

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