Cod sursa(job #2981754)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 18 februarie 2023 17:23:58
Problema Tunelul groazei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;

vector <pair<int, int>> v[256];
long double coef[256][257];

int main()
{
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);
    int n, m, a, b, c;
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> a >> b >> c;
        v[a].push_back({b, c});
        v[b].push_back({a, c});
    }
    for(int i = 1; i < n; i++)
    {
        ///rasp[i] * v[i].size() = suma(rasp[it.first] + it.second)
        coef[i][i] = v[i].size();
        for(auto it:v[i])
        {
            coef[i][it.first]--;
            coef[i][n + 1] += it.second;
        }
    }
    coef[n][n] = 1;
    ///gauss
    for(int i = 1; i <= n; i++)
    {
        for(int j = i; j <= n; j++)
            if(fabs(coef[j][i]) >= 0.001)
            {
                for(int k = 1; k <= n + 1; k++)
                    swap(coef[j][k], coef[i][k]);
                break;
            }
        if(fabs(coef[i][i]) < 0.001)
            continue;
        for(int j = i + 1; j <= n + 1; j++)
            coef[i][j] /= coef[i][i];
        coef[i][i] = 1;
        for(int j = 1; j <= n; j++)
            if(j != i)
            {
                for(int k = 1; k <= n + 1; k++)
                    if(k != i)
                        coef[j][k] -= coef[j][i] * coef[i][k];
                coef[j][i] = 0;
            }
    }
    cout << fixed << setprecision(4) << coef[1][n + 1];
    return 0;
}