Cod sursa(job #2704708)

Utilizator vlasiuflaviusVlasiu Flavius vlasiuflavius Data 11 februarie 2021 04:11:56
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 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.size() )
    {
        aux = q.front();
        q.pop();
        for( auto it : w[ aux ] )
        {
            if( flux[ aux ][ it ] == cap[ aux ][ it ] )
                continue;
            if( parent[ it ] == 0 && it != D )
            {
                parent[ it ] = aux;
                q.push( it );
            }
            else if( it == D )
                ok = 1;
        }
    }
}
void dinitz( int S , int D )
{
    do
    {
        ok = 0;
        bfs( S , D );
        for( auto it : w[ D ] )
        {
            mini = 1e9;
            if( parent[ it ] && cap[ it ][ D ] > flux[ it ][ D ] )
                parent[ D ] = it;
            else
                continue;
            for( nod = D ; nod != S ; nod = parent[ nod ] )
                mini = min( mini , cap[ parent[ nod ] ][ nod ] - flux[ parent[ nod ] ][ nod ] );
            for( nod = D ; nod != S ; nod = parent[ nod ] )
            {
                flux[ parent[ nod ] ][ nod ] += mini;
                flux[ nod ][ parent[ nod ] ] -= mini;
            }
            fluxtotal += mini;
        }
    }   while( ok );
}
int main()
{
    fin>>n>>m;
    for( i = 1 ; i <= m ; i++ )
    {
        fin>>a>>b>>c;
        cap[ a ][ b ] = c;
        cap[ b ][ a ] = c;
        w[ a ].push_back( b );
        w[ b ].push_back( a );
    }
    dinitz( 1 , n );
    fout<<fluxtotal<<'\n';
}