Cod sursa(job #2735319)

Utilizator dimi999Dimitriu Andrei dimi999 Data 2 aprilie 2021 11:32:09
Problema Tunelul groazei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <bits/stdc++.h>
#define EPS 0.00001
using namespace std;

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

int N, M;

double a[300][300], vals[305];

int S[305], grad[305];

vector <int> v[300];

int main()
{
    fin >> N >> M;

    for(int i = 1; i <= M; i++)
    {
        int x, y, z;

        fin >> x >> y >> z;
        grad[x]++;
        grad[y]++;

        S[x] += z;
        S[y] += z;

        v[x].push_back(y);
        v[y].push_back(x);
    }

    ///val[i] expected value de a ajunge de la i la N

    for(int i = 1; i <= N - 1; i++)///val[N] = 0
    {
        for(int j = 0; j < v[i].size(); j++)
            a[i][v[i][j]] ++;

        a[i][i] = -grad[i];
        a[i][N + 1] = -S[i];
    }

    ///rezolvam sistemul

    int l = 1, c = 1;

    while(l < N && c < N)
    {
        int li;

        for(int i = l; i < N; i++)
            if(a[i][c] > EPS || a[i][c] < -EPS)
        {
            li = i;
            break;
        }

        if(li == N)///e variabila libera
        {
            c++;
            continue;
        }

        double aux;

        for(int i = 1; i <= N + 1; i++)///interschimbm eucatiile
        {
            aux = a[li][i];
            a[li][i] = a[l][i];
            a[l][i] = aux;
        }

        for(int i = 1; i <= N + 1; i++)///obtinem coef 1 pe necunoscuta cautata
            if(i != c)
                a[l][i] /= a[l][c];
        a[l][c] = 1;

        for(int i = l + 1; i < N; i++)///scadem ecuatiile
            {
                for(int j = 1; j <= N + 1; j++)
                    if(j != c)
                        a[i][j] -= a[l][j] * a[i][c];
                a[i][c] = 0;
            }

        l++;
        c++;
    }

    ///scoatem valoriile
    vals[N] = 0;

    for(int i = N - 1; i >= 1; i--)
    {
        for(int j = 1; j < N; j++)
            if(a[i][j] > EPS || a[i][j] < -EPS)
        {
            vals[j] = a[i][N + 1];

            for(int it = j + 1; it <= N; it++)
                vals[j] -= vals[it] * a[i][it];

            break;
        }
    }

    fout << fixed << setprecision(5) << vals[1] << '\n';
    return 0;
}