Cod sursa(job #1501321)

Utilizator nacrocRadu C nacroc Data 13 octombrie 2015 11:40:43
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <queue>
#include <string.h>
#define NMAX 1005
#define inf 0x3f3f3f3f

using namespace std;

int N, M;
int C[NMAX][NMAX], flux[NMAX][NMAX];
int tata[NMAX];
queue <int> q;

int bfs(){
    int nod;
    for(;!q.empty(); q.pop());
    memset(tata, 0, sizeof(tata));
    q.push(1);
    while(!q.empty()){
        nod = q.front();
        q.pop();
        for(int i = 1; i <= N; ++i)
            if(!tata[i] && C[nod][i] > flux[nod][i]){
                q.push(i);
                tata[i] = nod;
                if(i == N) return 1;
            }
    }
    return 0;
}

int main(){
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    int r, i, x, y, c, fx;
    scanf("%d %d", &N, &M);
    for(int i = 1; i <= M; ++i){
        scanf("%d %d %d", &x, &y, &c);
        C[x][y] += c;
    }
    for(fx = 0; bfs(); fx += r){
        r = inf;
        i = N;
        while(i != 1){
            r = min(r, C[tata[i]][i] - flux[tata[i]][i]);
            i = tata[i];
        }
        i = N;
        while(i != 1){
            if(C[tata[i]][i] > 0){
                C[tata[i]][i] -= r;
                flux[i][tata[i]] += r;
            }else
                flux[tata[i]][i] -= r;
            i = tata[i];
        }
    }
    printf("%d\n", fx);
    return 0;
}