Cod sursa(job #3358632)

Utilizator CarenaMironov Cezar Luca Carena Data 18 iunie 2026 18:44:17
Problema Tunelul groazei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

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

const double EPS=1e-7;
int n, m;
vector<vector<double>> a;
vector<double> b, sol, poz;

void init()
{
    a.resize(n);
    b.resize(n);
    for(int i=0;i<n;i++)
        a[i].resize(n);
}

void gauss()
{
    sol.assign(n, 0);
    poz.assign(n, -1);
    int i=0, j=0;
    for(;i<n && j<n;j++)
    {
        for(int ii=i+1;ii<n;ii++)
            if(abs(a[ii][j])>abs(a[i][j]))
            {
                swap(a[i], a[ii]);
                swap(b[i], b[ii]);
            }
        if(abs(a[i][j])<EPS)
            continue;
        poz[j]=i;
        
        for(int ii=0;ii<n;ii++)
            if(ii!=i)
            {
                double q=a[ii][j]/a[i][j];
                for(int jj=0;jj<n;jj++)
                    a[ii][jj]-=q*a[i][jj];
                b[ii]-=q*b[i];
                a[ii][j]=0;
            }
        i++;
    }
    
    for(j=0;j<n;j++)
        if(poz[j]!=-1)
            sol[j]=b[poz[j]]/a[poz[j]][j];
}

int main()
{
    in>>n>>m;
    init();
    while(m--)
    {
        int u, v, c; in>>u>>v>>c;
        u--; v--;
        a[u][u]++; a[v][v]++;
        a[u][v]--; a[v][u]--;
        b[u]+=c; b[v]+=c;
    }
    
    for(int i=0;i<n;i++)
        a[n-1][i]=0;
    a[n-1][n-1]=1;
    b[n-1]=0;
    
    gauss();
    out<<round(sol[0]);
    return 0;
}