Cod sursa(job #2122072)

Utilizator vlasiuflaviusVlasiu Flavius vlasiuflavius Data 4 februarie 2018 16:45:58
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <iostream>
#include <queue>
#include <cstring>
#include <vector>
#define nmax 1005
using namespace std;
ofstream fout ("maxflow.out");
ifstream fin ("maxflow.in");
int n,m,parent[nmax],flux[nmax][nmax],cap[nmax][nmax],nod,a,b,c,fluxtotal,ok,aux,mini,i;
vector < int > w[nmax];
inline void bfs( int S , int D )
{
    queue < int > q;
    q.push( S );
    memset( parent , 0 , sizeof( parent ) );
    parent[ S ] = -1;
    while( !q.empty() )
    {
        aux = q.front();
        q.pop();
        for( auto it : w[ aux ] )
        {
            if( flux[ aux ][ it ] < cap[ aux ][ it ] )
            {
                if( parent[ it ] == 0 && it != D )
                {
                    parent[ it ] = aux;
                    q.push( it );
                }
                else if( it == D )
                    ok = 1;
            }
        }
    }
}
inline void dinitz( int S , int D )
{
    bfs( S , D );
    while( ok )
    {
        ok = 0;
        mini = 1e9;
        for( auto it : w[ D ] )
        {
            if( parent[ it ] && cap[ it ][ D ] > flux[ it ][ D ] )
            {
                parent[ D ] = it;
                for( nod = D ; nod != S ; nod = parent[ nod ] )
                    mini = min( mini , cap[ parent[ nod ] ][ nod ] - flux[ parent[ nod ] ][ nod ] );
                if( mini <= 0 )
                    continue;
                for( nod = D ; nod != S ; nod = parent[ nod ] )
                {
                    flux[ parent[ nod ] ][ nod ] += mini;
                    flux[ nod ][ parent[ nod ] ] -= mini;
                }
                fluxtotal += mini;
            }
        }
        bfs( S , D );
    }
}
int main()
{
    ios::sync_with_stdio( false );
    fin>>n>>m;
    for( i = 1 ; i <= m ; i++ )
    {
        fin>>a>>b>>c;
        cap[ a ][ b ] = c;
        w[ a ].push_back( b );
        w[ b ].push_back( a );
    }
    dinitz( 1 , n );
    fout<<fluxtotal<<'\n';
    fin.close();
    fout.close();
    return 0;
}