Cod sursa(job #3314173)

Utilizator Cristian_NegoitaCristian Negoita Cristian_Negoita Data 8 octombrie 2025 19:45:40
Problema Tunelul groazei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("tunel.in");
ofstream fout("tunel.out");
const int NMAX = 256;
const double EPS = 1e-9;
int n, m, deg[NMAX], adj[NMAX][NMAX];
double A[NMAX][NMAX + 1], sum[NMAX], x[NMAX];

void swap_lines(int i, int j)
{
    for(int k = 1; k <= m + 1; k++)
        swap(A[i][k], A[j][k]);
}

void gauss()
{
    int i = 1, j = 1, k;
    while(i <= n && j <= m)
    {
        for(k = i; k <= n; k++)
            if(abs(A[k][j]) > EPS)
                break;
        if(k == n + 1)
        {
            j++;
            continue;
        }
        swap_lines(i, k);
        for(int l = j + 1; l <= m + 1; l++)
            A[i][l] /= A[i][j];
        A[i][j] = 1;
        for(int l = i + 1; l <= n; l++)
        {
            for(int c = j + 1; c <= m + 1; c++)
                A[l][c] -= A[l][j] * A[i][c];
            A[l][j] = 0;
        }
        i++, j++;
    }
    for(int i = n; i >= 1; i--)
    {
        for(int j = 1; j <= m + 1; j++)
        {
            if(abs(A[i][j]) > EPS)
            {
                x[j] = A[i][m + 1];
                for(int k = j + 1; k <= m; k++)
                    x[j] -= x[k] * A[i][k];
                break;
            }
        }
    }
}

int main()
{
    fin >> n >> m;
    while(m--)
    {
        int u, v, cost;
        fin >> u >> v >> cost;
        deg[u]++; deg[v]++;
        sum[u] += cost, sum[v] += cost;
        if(u != n && v != n)
        {
            adj[u][v]++;
            adj[v][u]++;
        }
    }
    m = n - 1;
    for(int i = 1; i <= n - 1; i++)
    {
        A[i][i] = deg[i];
        for(int j = 1; j <= n - 1; j++)
            if(i != j)
                A[i][j] = -adj[i][j];
        A[i][m + 1] = sum[i];
    }
    gauss();
    fout << x[1];

    fin.close();
    fout.close();
    return 0;
}