Cod sursa(job #1453961)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 25 iunie 2015 10:10:24
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>

#define NMAX 1007
#define INF 1 << 30

using namespace std;

queue < int > q;
vector < int > v[NMAX];
int Cap[NMAX][NMAX], dad[NMAX];
int n, m;

int bfs(){
    while(! q.empty())
        q.pop();
    q.push(1);
    dad[1] = -2;
    while(!q.empty() && dad[n] == -1){
        int Nod = q.front();
        q.pop();
        for(int i = 0; i < v[Nod].size(); ++i){
            int it = v[Nod][i];
            if(dad[it] == -1 && Cap[Nod][it] > 0){
                dad[it] = Nod;
                q.push(it);
                if(it == n)
                    return 1;
            }
        }
    }
    return 0;
}

int main(){
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; ++i){
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        v[a].push_back(b);
        v[b].push_back(a);
        Cap[a][b] += c;
    }
    int MaxFlow = 0;
    memset(dad, -1, sizeof(dad));
    while(bfs()){
        int Nod = n, Min = INF;
        while(Nod > 1){
            Min = min(Min, Cap[dad[Nod]][Nod]);
            Nod = dad[Nod];
        }
        MaxFlow += Min;
        Nod = n;
        while(Nod > 1){
            Cap[dad[Nod]][Nod] -= Min;
            Nod = dad[Nod];
        }
        memset(dad, -1, sizeof(dad));
    }
    printf("%d\n", MaxFlow);
    return 0;
}