Cod sursa(job #996860)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 12 septembrie 2013 19:51:18
Problema Traseu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("traseu.in");
ofstream g("traseu.out");

#define mp make_pair
#define x first
#define y second
#define LE 266
#define mp make_pair
#define pii pair<int,int>

int i,n,j,_dr[LE];
int D[LE][LE],que[10*LE];
pii cap[LE][LE];
int father[LE],m,grad[LE];

void roy_floyd()
{
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j)
            for(int k=1; k<=n; ++k)  if (j!=k)
                if (D[j][i]&&D[i][k]&&(D[j][i]+D[i][k]<D[j][k]||D[j][k]==0))
                    D[j][k]=D[j][i]+D[i][k];
}

#define inf (1<<28)

bool bell_man(int source,int dest)
{
    int i,j,k=0;
    for(i=0; i<=n+n+1; ++i) _dr[i]=inf;
    _dr[source]=0;

    que[++k]=source;

    for(i=1; i<=k; ++i)
        for(j=0; j<=n+n+1; ++j)
           if (cap[que[i]][j].x)
                if (_dr[j]>_dr[que[i]]+cap[que[i]][j].y)
                {
                    _dr[j]=_dr[que[i]]+cap[que[i]][j].y;
                    que[++k]=j;
                    father[j]=que[i];
                }
    if(_dr[dest]==inf) return false;
    return true;
}

int _gflow(int source,int dest)
{
    int result=0;

    while (bell_man(source,dest))
    {
        int nod=dest,fmax=inf,cost=0;

        for (; nod!=source; nod=father[nod])
        {
            fmax=min(fmax,cap[father[nod]][nod].x);
            cost+=cap[father[nod]][nod].y;
        }

        for(nod=dest; nod!=source; nod=father[nod])
        {
            cap[father[nod]][nod].x-=fmax;
            cap[nod][father[nod]].x+=fmax;
        }
        result+=(fmax*cost);
    }

    return result;
}
int suma=0;

int main()
{
    f>>n>>m;
    for(i=1; i<=m; ++i)
    {
        int xx,yy,cc;
        f>>xx>>yy>>cc;
        D[xx][yy]=cc;
        grad[xx]++;
        grad[yy]--;
        suma+=cc;
    }

    roy_floyd();

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

        //cout<<'\n'<<'\n';

   // for(i=1;i<=n;++i)  cout<<grad[i]<<" ";
   // cout<<'\n';


    for(i=1; i<=n; ++i)
    {
        if(grad[i]<0) cap[0][i]=mp(-grad[i],0);
        if (grad[i]>0) cap[i+n][n+n+1]=mp(grad[i],0);
    }

    for(i=1; i<=n; ++i)
        for(j=1; j<=n; ++j) if (D[i][j]||i==j)
                if (grad[i]<0&&grad[j]>0) {
                cap[i][n+j]=mp(inf,D[i][j]);
                 cap[n+j][i]=mp(0,-D[i][j]);
                }


   // for(i=0;i<=n+n+1;++i,cout<<'\n')
   //    for(j=0;j<=n+n+1;++j) cout<<cap[i][j].x<<" ";

    g<<_gflow(0,n+n+1)+suma;



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