Cod sursa(job #1045210)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 1 decembrie 2013 01:15:19
Problema Flux Scor 28
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 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];
db result=0;
pair<int,int> ed[LE*LE];
#define mp make_pair
#define x first
#define y second
db ced[LE*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;
     double vmin=1;

    for(i=1;i<=30;++i)
      vmin=vmin*(db)i;

    for(i=1; i<=m; ++i)
    {
        f>>xx>>yy>>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&&yy!=n) ec[yy-1][yy]++;
    }

   //for(i=1;i<=n;++i)
      // for(j=1;j<=n;++j)
       //  if (viz[i][j]==false&&vaca[i][j]!=0)
       //   int okz=1;

    for(i=2; i<n; ++i)
        for(j=2; j<=n; ++j)
        //  if (viz[i][j])
            {
       //         if (viz[i][j]==false&&vaca[i][j])
         //         int okz=true;

                ec[i-1][j]-=vaca[i][j];
                ec[i-1][i]+=vaca[i][j];
            }
    val[2]=1;

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


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


    _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.0000000001)
            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;
}