Cod sursa(job #2126718)

Utilizator Bodo171Bogdan Pop Bodo171 Data 9 februarie 2018 21:39:46
Problema Flux Scor 96
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 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];
long double ans[nmax];
int N,m,i,j,k,x,y;
long double answer,rap,cap;
void solve()
{
    for(i=1;i<=N+2;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+2;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+2;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])
             answer=min(answer,mn[i][j]/(ans[j]-ans[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);
    }
    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[N+1][1]=1;a[N+1][N+1]=0;
    solve();
    g<<fixed<<setprecision(6)<<answer;
    return 0;
}