Cod sursa(job #2030997)

Utilizator livliviLivia Magureanu livlivi Data 2 octombrie 2017 16:38:54
Problema Flux Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.98 kb
#include<fstream>
#include<iomanip>
#include<vector>
#include<utility>
#include<cmath>
#define N 100
#define MULT 100000000.0
#define EPS 10e-10
using namespace std;

int c[N+1][N+1];
double ecu[N+1][N+1];
double dist[N+1];

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

int gauss(int n){
    int i,j,l;
    int ans=0;

    for(i=2,j=2;i<=n;i++){
        for(l=j;l<n;l++)
            if (ecu[l][i]>EPS ||ecu[l][i]<-EPS) break;

        if (l==n){
            ans=l;
            continue ;
        }

        for(int o=2;o<=n;o++){
            double aux=ecu[j][o];
            ecu[j][o]=ecu[l][o];
            ecu[l][o]=aux;
        }

        for(l=2;l<n;l++)
            if (l!=j &&(ecu[l][i]>EPS ||ecu[l][i]<-EPS)){
                double aux=-ecu[l][i]/ecu[j][i];
                for(int o=2;o<=n;o++)
                    ecu[l][o]=ecu[l][o]+aux*ecu[j][o];
            }

        j++;
    }

    return ans;
}

int main(){
    int n,m,i,j;

    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            c[i][j]=MULT;

    for(i=1;i<=m;i++){
        int a,b,x;
        fin>>a>>b>>x;

        c[a][b]=min(c[a][b],x);
        c[b][a]=min(c[b][a],x);

        ecu[a][b]++;
        ecu[a][a]--;
        ecu[b][a]++;
        ecu[b][b]--;
    }

    for(i=2;i<n;i++)
        ecu[i][1]=0;

    int ned=gauss(n);

    dist[ned]=1;
    for(i=2;i<=n;i++){
        if (i==ned) continue;

        for(j=2;j<=n;j++)
            if (j!=ned &&(ecu[i][j]>EPS ||ecu[i][j]<-EPS)) break;

        if (j<=n) dist[j]=-(ecu[i][ned]/ecu[i][j]);
    }

     double resc=MULT;
     for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            double aux=abs(dist[i]-dist[j]);
            if (aux>EPS) resc=min(resc,c[i][j]/aux);
        }

    for(i=1;i<=n;i++)
        dist[i]*=resc;

    double ans=0;
    for(j=1;j<=n;j++)
        ans+=(dist[j]*ecu[n][j]);

    ans=abs(ans);
    fout<<setprecision(6)<<fixed<<ans;
    return 0;
}