Cod sursa(job #1023259)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 6 noiembrie 2013 18:13:45
Problema Flux Scor 64
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <vector>
#include <utility>
#include <iomanip>
#include <cmath>

#define maxn 101
#define inf 1<<30
#define vintp vector<pair<int,int> >::iterator

using namespace std;

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

double a[maxn][maxn],val[maxn],b[maxn],ans=inf;
vector <pair<int,int> > G[maxn];
int n,m,x,y,c;
bool viz[maxn];

void swaplines (int i, int j)
{
    for (int k=1; k<=n; ++k)
    {
        swap(a[i][k],a[j][k]);
    }
}

double min (double a, double b)
{
    if (a<b) return a;
    return b;
}

void dfs (int x)
{
    viz[x] = 1;

    for (vintp it = G[x].begin(); it != G[x].end(); ++it)
    {
        ans = min (fabs(it->second/(val[it->first]-val[x])),ans);

        if (!viz[x]) dfs (it->first);
    }
}

int main()
{
    fin>>n>>m;

    for (int i=1; i<=m; ++i)
    {
        fin>>x>>y>>c;

        a[x][y]--;
        a[x][x]++;

        a[y][x]--;
        a[y][y]++;

        G[x].push_back (make_pair(y,c));
        G[y].push_back (make_pair(x,c));
    }

    b[1] = -1;
    b[n] = 1;

    for (int i=1; i<=n; ++i)
    {
        int j=i,ok=0;

        for (int k=i; k<=n; ++k)
        {
            if (a[k][j])
            {
                ok=1;
                swaplines (k,i);
                break;
            }
        }

        if (!ok) continue;

        for (int jj=j+1; jj<=n; ++jj)
        {
            a[i][jj] /= a[i][j];
        }
        b[i] /= a[i][j];
        a[i][j] = 1;

        for (int ii=i+1; ii<=n; ++ii)
        {
            for (int jj=j+1; jj<=n; ++jj)
            {
                a[ii][jj] -= (a[i][jj]*a[ii][j]);
            }
            b[ii] -= (b[i]*a[ii][j]);
            a[ii][j] = 0;
        }
    }

    for (int i=n; i>=1; --i)
    {
        int j = i;

        if (b[i] && a[i][j])
        {
            val[j] = b[i];

            for (int k=i-1; k>=1; --k)
            {
                b[k] -= a[k][j]*b[i];
            }
        }
    }

    dfs (1);

    fout<<fixed<<setprecision(3)<<ans;
}