Cod sursa(job #2406247)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 15 aprilie 2019 16:07:54
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
#define N 1005

using namespace std;

ifstream fin("maxflow.in") ;
ofstream fout("maxflow.out") ;

vector<int> graf[N] ;
int cap[N][N] , flux[N][N] ;
bool viz[N] ;
int n , m , tt[N];
vector<int> nvec;

void citire()
{
    int i , x , y , z;
    fin >> n >> m ;
    for ( i = 1 ; i <= m ; i++ )
    {
        fin >> x >> y >> z ;
        graf[x].push_back(y) ;
        graf[y].push_back(x) ;
        cap[x][y] = z ;
    }
}

bool bfs()
{
    int nod ;
    queue<int> Q;
    memset(viz,false,N-3) ;
    Q.push(1) ;
    viz[1] = true ;
    while (!Q.empty())
    {
        nod = Q.front() ;
        Q.pop() ;
        if ( nod == n )
            continue ;
        for ( auto vec : graf[nod] )
        {
            if ( viz[vec] || cap[nod][vec] == flux[nod][vec] )
                continue ;
            Q.push(vec) ;
            viz[vec] = true ;
            tt[vec] = nod ;
        }
    }
    return viz[n];
}

int main()
{
    int i , fmin , sol=0;
    citire() ;
    while (bfs())
    {
        for ( auto vec : graf[n] )
        {
            if ( viz[vec] == false || cap[vec][n] == flux[vec][n] )
                continue ;
            tt[n] = vec;
            fmin = 0x3f3f3f3f ;
            for ( i = n ; i != 1 ; i = tt[i] )
                fmin = min(fmin,cap[tt[i]][i]-flux[tt[i]][i]) ;
            if ( fmin == 0 )
                continue ;
            for ( i = n ; i != 1 ; i = tt[i] )
                flux[tt[i]][i] = flux[tt[i]][i] + fmin ;
            sol = sol + fmin ;
        }
    }
    fout << sol ;
}