Cod sursa(job #2123958)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 6 februarie 2018 19:14:06
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <bits/stdc++.h>
#define NMAX 1001

using namespace std;

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

int n , m ;
int cap[NMAX][NMAX] , flux[NMAX][NMAX] , t[NMAX] ;
vector<int> graf[NMAX] ;
bool viz[NMAX] ;

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

int BFS()
{
    int nod ;
    queue<int> Q ;
    Q.push(1) ;
    memset(viz,false,n+1) ;
    viz[1] = 1 ;
    Q.push(1) ;
    while(!Q.empty())
    {
        nod = Q.front() ;
        Q.pop() ;
        if ( nod == n )
            continue ;
        for ( int i = 0 ; i < graf[nod].size() ; i++ )
        {
            if ( cap[nod][graf[nod][i]] == flux[nod][graf[nod][i]] || viz[graf[nod][i]] )
                continue ;
            Q.push(graf[nod][i]) ;
            viz[graf[nod][i]] = true ;
            t[graf[nod][i]] = nod ;
        }
    }
    return viz[n] ;
}

int main()
{
    int flx = 0, fmin , i , j ;
    citire() ;
    while(BFS())
    {
        for ( j = 0 ; j < graf[n].size() ; j++ )
        {
            if ( !viz[graf[n][j]] || cap[graf[n][j]][n]==flux[graf[n][j]][n] )
                continue ;
            t[n] = graf[n][j] ;
            fmin = 0x3f3f3f3f;
            for ( i = n ; i > 1 ; i = t[i] )
                fmin = min(fmin,cap[t[i]][i]-flux[t[i]][i]) ;
            if ( fmin == 0 )
                continue ;
            for ( i = n ; i > 1 ; i = t[i] )
            {
                flux[t[i]][i] = flux[t[i]][i] + fmin ;
                flux[i][t[i]] = flux[i][t[i]] - fmin ;
            }
            flx = flx+fmin ;
        }
    }
    fout << flx ;
}