Cod sursa(job #3364802)

Utilizator CarenaMironov Cezar Luca Carena Data 11 septembrie 2026 17:50:43
Problema Flux Scor 96
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <iomanip>
#include <vector>
#include <cassert>
#define fr first
#define sc second

using namespace std;

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

const int NMAX=1e2+5;
const double EPS=1e-7, INF=1e10;
int n, m;
vector<pair<int, double>> adj[NMAX];
vector<vector<double>> a;
vector<double> b, sol;
vector<int> poz;

void gauss()
{
    sol.assign(n, 0);
    poz.assign(n, -1);
    int i=0, j=0;
    for(;i<n && j<n;j++)
    {
        int maxi=i;
        for(int ii=i;ii<n;ii++)
            if(a[ii][j]>a[maxi][j])
                maxi=ii;
        if(abs(a[maxi][j])<EPS)
            continue;
        swap(a[i], a[maxi]);
        swap(b[i], b[maxi]);
        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];
            }
        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;
    while(m--)
    {
        int a, b, c; in>>a>>b>>c;
        a--; b--;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    
    a.resize(n); b.assign(n, 0);
    for(int i=1;i<=n-2;i++)
    {
        a[i].assign(n, 0);
        //cat intra in i = cat iese din i
        a[i][i]=adj[i].size();
        for(auto ej:adj[i])
            a[i][ej.fr]-=1;
    }
    //f[0]=1
    a[0].assign(n, 0); a[0][0]=b[0]=1;
    a[n-1].assign(n, 0);
    //cat iese din 0 = cat intra in n
    a[n-1][0]=adj[0].size(); a[n-1][n-1]=adj[n-1].size();
    for(auto ej:adj[0])
        a[n-1][ej.fr]+=1;
    for(auto ej:adj[n-1])
        a[n-1][ej.fr]+=1;
    
    gauss();
    double maxk=INF;
    for(int i=0;i<n;i++)
        for(auto ej:adj[i])
            if(sol[i]>sol[ej.fr])
                maxk=min(maxk, ej.sc/(sol[i]-sol[ej.fr]));
    
    double f=0;
    for(auto ej:adj[0])
    {
        assert(poz[ej.fr]!=-1);
        f+=(sol[ej.fr]-sol[0]);
    }
    out<<fixed<<setprecision(10)<<abs(maxk*f);
    return 0;
}