Cod sursa(job #2958079)

Utilizator DordeDorde Matei Dorde Data 24 decembrie 2022 15:05:26
Problema Tunelul groazei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <valarray>
#include <iomanip>

using namespace std;
ifstream fin("tunel.in");
ofstream fout("tunel.out");
int const N = (1 << 8) + 3;
typedef valarray<double> vd;
int n , m;
vector<pair<int , int> > v[N];
valarray<vd> mat(vd(0.0 , N) , N);
void gauss(vd &r){
    int i = 1 , j = 1;
    while(i <= n && j <= n){
        int k = i;
        while(k <= n && abs(mat[k][j]) < 0.001){
            ++ k;
        }
        if(k == n + 1){
            ++ j;
            continue;
        }
        swap(mat[i] , mat[k]);
        mat[i] /= (double)mat[i][j];
        for(k = i + 1 ; k <= n ; ++ k)
            mat[k] -= (mat[i] * (double)mat[k][j]);
        ++ j , ++ i;
    }
    for(int i = n ; i ; -- i){
        r[i] = mat[i][n + 1];
        for(int j = i + 1 ; j <= n ; ++ j)
            r[i] -= r[j] * mat[i][j];
    }
}
int main()
{
    fin >> n >> m;
    for(int i = 1 ; i <= m ; ++ i){
        int a , b , c;
        fin >> a >> b >> c;
        v[a].emplace_back(b , c);
        v[b].emplace_back(a , c);
    }
    for(int i = 1 ; i <= n ; ++ i){
        mat[i][i] = -1.0;
        if(i == n)
            continue;
        int W(0) , nrv = v[i].size();
        for(auto [y , w] : v[i]){
            mat[i][y] += 1.0 / nrv;
            W += w;
        }
        mat[i][n + 1] = -1.0 * W / nrv;
    }
    vd X(0.0 , n + 2);
    gauss(X);
    fout << fixed << setprecision(4) << X[1] << '\n';
    return 0;
}