Cod sursa(job #2126372)

Utilizator Bodo171Bogdan Pop Bodo171 Data 9 februarie 2018 16:13:20
Problema Flux Scor 96
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
const int nmax=105;
const long double eps=0.000000001;
long double a[nmax][nmax],mn[nmax][nmax];
int n[nmax][nmax];
int p[nmax],viz[nmax];
long double ans[nmax];
int N,m,i,j,k,x,y;
long double answer,rap,cap;
void solve()
{
    for(i=1;i<=N;i++)
    {
        while(p[i]<=N+1&&fabs(a[i][p[i]])<eps)
            p[i]++;
        if(p[i]==N+1) {answer=0;return;}
        if(p[i]==N+2) continue;
        for(j=1;j<=N;j++)
            if(i!=j&&fabs(a[j][p[i]])>eps)
        {
            rap=a[j][p[i]]/a[i][p[i]];
            for(k=1;k<=N+1;k++)
                a[j][k]-=a[i][k]*rap;
        }
    }
    for(i=1;i<=N;i++)
        ans[p[i]]=a[i][N+1]/a[i][p[i]];
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
          if(n[i][j]&&ans[i]<ans[j]&&viz[i])
             answer=min(answer,mn[i][j]/(ans[j]-ans[i]));
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
          if(viz[i]&&mn[i][j]==0)
              answer=0;
}
void dfs(int x)
{
    viz[x]=1;
    for(int i=1;i<=N;i++)
        if(n[x][i]&&(!viz[i]))
          dfs(i);
}
int main()
{
    ifstream f("flux.in");
    ofstream g("flux.out");
    f>>N>>m;answer=(1<<30);
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
          mn[i][j]=10001;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>cap;
        n[x][y]++;n[y][x]++;
        mn[x][y]=min(mn[x][y],cap);mn[y][x]=min(mn[y][x],cap);
    }
    dfs(1);
    for(i=2;i<=N;i++)
    {
        for(j=1;j<=N;j++)
        {
            a[i][i]+=n[i][j];
            if(j!=1)a[i][j]-=n[i][j];
        }
    }
    //a[1][N+1]=-1;
    a[N][N+1]=1;
    solve();if(!viz[N]) answer=0;
    g<<fixed<<setprecision(6)<<answer;
    return 0;
}