Cod sursa(job #1376945)

Utilizator BologaDragosBologa Dragos BologaDragos Data 5 martie 2015 19:27:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>

#include <queue>

#define NMAX 1003

#define INF 0x3f3f3f3f

#define MMAX 5003

using namespace std;

queue <int> q ;

int c[NMAX][NMAX],flow[NMAX][NMAX] ;
int flux=0 ;

int lst[NMAX],t[NMAX],nrvf=0 ;

int vf[2*MMAX] ;

int urm[2*MMAX] ;

int n,m ;


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


inline bool bf()
{
    bool ok=0 ;

    for(int i=1;i<=n;i++)
        t[i]=0 ;
    t[1]=-1 ;
    q.push(1) ;

    while(!q.empty())
    {
        int x=q.front() ;
        for(int i= lst[x];i!=0;i=urm[i])
        {
            int y=vf[i] ;
            if(t[y]==0&&c[x][y]>flow[x][y])
                if(y!=n)
                {
                    t[y]=x ;
                    q.push(y) ;
                }
                else
                    ok=1 ;
        }
        q.pop() ;
    }
    return ok ;

}

void Solve()
{

    bool drum=1 ;
    while(drum)
    {
        drum=bf() ;
        for(int i=lst[n];i!=0;i=urm[i])
        {
            int y=vf[i] ;
            if(t[y]&&c[y][n]>flow[y][n])
            {
                t[n]=y ;
                int minim = INF ;
                for(int x=n ;x!=1;x=t[x])
                    if(minim>c[t[x]][x]-flow[t[x]][x])
                        minim= c[t[x]][x]-flow[t[x]][x] ;
                if(minim<=0)
                    continue ;

                flux +=minim ;
                for(int x=n;x!=1;x=t[x])
                {
                    flow[t[x]][x]+=minim ;
                    flow[x][t[x]]-=minim ;
                }
            }
        }

    }


}



int main()
{
    int x,y ;
    f>>n>>m ;
    for(int i=1;i<=m;i++)
    {
        f>>x>>y ;
        f>>c[x][y] ;


        vf[++nrvf]=y ;
        urm[nrvf]=lst[x] ;
        lst[x]=nrvf ;


        vf[++nrvf]=x ;
        urm[nrvf]=lst[y] ;
        lst[y]=nrvf ;


    }

    Solve() ;

    g<<flux<<'\n' ;

    return 0;
}