Cod sursa(job #3364808)

Utilizator CarenaMironov Cezar Luca Carena Data 11 septembrie 2026 18:33:13
Problema Flux Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.62 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, maxi[2];
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++)
        if(poz[i]!=-1)
            for(auto ej:adj[i])
                if(poz[ej.fr]!=-1 && sol[i]>sol[ej.fr])
                    maxk=min(maxk, ej.sc/(sol[i]-sol[ej.fr]));
    
    maxi[0].assign(n, INF); maxi[1].assign(n, INF);
    for(int i=0;i<n;i++)
        if(poz[i]==-1)
            for(auto ej:adj[i])
            {
                maxi[0][i]=min(maxi[0][i], maxk*sol[ej.fr]+ej.sc);
                maxi[1][i]=min(maxi[1][i], -maxk*sol[ej.fr]+ej.sc);
            }
            
    double fp=0, fn=0;
    for(auto ej:adj[0])
        if(poz[ej.fr]!=-1)
        {
            fp+=maxk*(sol[ej.fr]-sol[0]);
            fn-=maxk*(sol[ej.fr]-sol[0]);
        }
        else
        {
            fp+=(maxi[0][ej.fr]-maxk*sol[0]);
            fn+=(maxi[1][ej.fr]+maxk*sol[0]);
        }
    
    out<<fixed<<setprecision(10)<<max(fp, fn);
    return 0;
}