Cod sursa(job #2126725)

Utilizator Bodo171Bogdan Pop Bodo171 Data 9 februarie 2018 21:44:01
Problema Flux Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
const int nmax=105;
const long double eps=0.00000001;
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=0;i<=N+1;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=0;j<=N+1;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;
            a[j][p[i]]=0;
        }
    }
    for(i=0;i<=N+2;i++)
        {
            ans[p[i]]=a[i][N+1]/a[i][p[i]];
            if(a[i][p[i]]==0) ans[p[i]]=0;
        }
    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]));
}
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]=100001;
    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=1;i<=N;i++)
    {
        for(j=1;j<=N;j++)
        {
            a[i][i]+=n[i][j];
            a[i][j]-=n[i][j];
        }
    }
    a[1][N+1]=-1;
    a[N][N+1]=1;
    a[0][1]=1;a[0][N+1]=0;
    solve();if(!viz[N]) answer=0;
    g<<fixed<<setprecision(6)<<answer;
    return 0;
}