Cod sursa(job #751356)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 25 mai 2012 20:48:13
Problema Flux Scor 92
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.06 kb
#include <cstdio>
#include <vector>

using namespace std;

#define maxn 110
#define maxm 5010
#define eps 0.00001
#define inf 1000000000

int n, m, x, y;
double g[maxn][maxn], sol[maxn], rez;
int a[maxm], b[maxm], c[maxm], f[maxm];
vector<int> v[maxn];

void df(int nod)
{
    f[nod]=1;
    for(int i=0; i<v[nod].size(); ++i)
        if(f[v[nod][i]]==0)
            df(v[nod][i]);
}

int main()
{
    freopen("flux.in", "r", stdin);
    freopen("flux.out", "w", stdout);

    scanf("%d%d", &n, &m);
    for(int i=1; i<=m; ++i)
    {
        scanf("%d%d%d", &a[i], &b[i], &c[i]);
        v[a[i]].push_back(b[i]);
        v[b[i]].push_back(a[i]);
    }

    df(1);
    if(f[n]==0)
    {
        printf("0.000\n");
        return 0;
    }

    for(int i=1; i<=m; ++i)
    {
        if(a[i]!=1)
        {
            g[a[i]][a[i]]+=1;
            g[a[i]][b[i]]-=1;
        }
        if(b[i]!=1)
        {
            g[b[i]][b[i]]+=1;
            g[b[i]][a[i]]-=1;
        }
    }
    g[n][n+1]=1;

    int i=1, j=1;
    while(i<=n && j<=n)
    {
        int k;
        double aux;
        for(k=i; k<=n; ++k)
            if(g[k][j]<-eps || g[k][j]>eps)
                break;

        if(k==n+1)
        {
            ++j;
            continue;
        }

        if(k!=i)
            for(int l=1; l<=n+1; ++l)
            {
                aux=g[i][l];
                g[i][l]=g[k][l];
                g[k][l]=aux;
            }

        for(int l=j+1; l<=n+1; ++l)
            g[i][l]=g[i][l]/g[i][j];
        g[i][j] = 1;

        for(int u=i+1; u<=n; ++u)
        {
            for(int l=j+1; l<=n+1; ++l)
                g[u][l]-=g[u][j]*g[i][l];
            g[u][j] = 0;
        }

        ++i; ++j;
    }

    for(int i=n; i; --i)
    {
        if(g[i][i]>eps)
        {
            sol[i]=g[i][n+1];
            for(int j=i+1; j<=n; ++j)
                sol[i]-=g[i][j]*sol[j];
        }
    }

    rez=inf;

    for(int i=1; i<=m; ++i)
    {
        if(sol[a[i]]<sol[b[i]])
            swap(a[i], b[i]);
        rez=min(rez, c[i]/(sol[a[i]]-sol[b[i]]));
    }

    printf("%.6lf\n", rez);

    return 0;
}