Cod sursa(job #1045201)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 1 decembrie 2013 00:53:58
Problema Flux Scor 28
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("flux.in");
ofstream g("flux.out");

#define db double
#define LE 166
#define inf (1<<30)
#include <iomanip>
db ec[LE][LE];
bool viz[LE][LE];
int i,j,n,m,xx;
int yy,cc,p;
int vaca[LE][LE];
db val[LE], vmin=inf;
db result=0,hmax[LE][LE];
pair<int,int> ed[LE];
#define mp make_pair
#define x first
#define y second
db ced[LE];
int nred;

void _gauss(int nrec)
{
    int i,j,lin=0;

    while (true)
    {
        int minx=inf,ind;

        for(i=lin+1; i<=nrec; ++i)
            for(j=1; j<=n; ++j)
                if (ec[i][j]&&j<minx)
                {
                    minx=j;
                    ind=i;
                }
        if (minx==inf) break;
        ++lin;
        for(i=1; i<=n; ++i) swap(ec[lin][i],ec[ind][i]);

        for(i=lin+1; i<=nrec; ++i)
        {
            db coef=ec[i][minx]/ec[lin][minx];
            for(j=1; j<=n+1; ++j) ec[i][j]-=(ec[lin][j]*coef);
        }
    }

    for(i=lin; i>0; --i)
    {
        for(p=1; p<=n; ++p) if (ec[i][p]) break;
        val[p]=ec[i][n+1]/ec[i][p];
        for(j=1; j<i; ++j) ec[j][n+1]-=(val[p]*ec[j][p]);
    }
}

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

    for(i=1; i<=m; ++i)
    {
        f>>xx>>yy>>cc;
        hmax[xx][yy]=hmax[yy][xx]=cc;
        viz[xx][yy]=viz[yy][xx]=true;
        vaca[xx][yy]++;
        vaca[yy][xx]++;
        ed[++nred]=mp(xx,yy);
        ced[nred]=cc;
        if (xx>yy)swap(xx,yy);
        if (xx==1) ec[yy-1][yy]++;
    }

    for(i=2; i<n; ++i)
        for(j=2; j<=n; ++j)
            if (viz[i][j])
            {
                ec[i-1][j]=-vaca[i][j];
                ec[i-1][i]+=vaca[i][j];
            }
    val[2]=1;

    for(i=1; i<=n-2; ++i)
    {
        ec[i][n+1]-=(ec[i][2]);
        ec[i][2]=0;
    }

  //  for(i=1; i<=n-2; ++i,cout<<'\n')
    //    for(j=1; j<=n+1; ++j) cout<<ec[i][j]<<" ";
   // cout<<'\n'<<'\n';

    _gauss(n-2);
    g<<fixed;
    g<<setprecision(3);
    //for(i=1; i<=n; ++i) cout<<val[i]<<" ";
   // cout<<'\n'<<'\n';

    for(int t=1; t<=nred; ++t)
    {
        i=ed[t].x;
        j=ed[t].y;
        if (val[i]>val[j]) swap(i,j);

        if (val[j]-val[i]>=0.0000000000001)
            vmin=min(vmin,ced[t]/(val[j]-val[i]));
    }

    for(int t=1; t<=nred; ++t)
    {
        i=ed[t].x;
        j=ed[t].y;
        if (val[i]>val[j]) swap(i,j);
        if (j!=n) continue;

        result+=(val[j]-val[i])*vmin;
    }

    g<<result<<'\n';

    f.close();
    g.close();
    return 0;
}