Cod sursa(job #1509277)

Utilizator timicsIoana Tamas timics Data 23 octombrie 2015 17:32:54
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int x,y,z,M;

#define inf 1000000000
int flux,N,rez,c[1100][1100],f[1100][1100],p[1100];
int q[1100],first,last;
vector<int> m[1100];
bool viz[1100];

inline bool bfs(int S, int D) {
    first = 0, last = 0;
    for(int i=1;i<=N;++i) {
        viz[i] = 0;
    }
    q[last++] = 1; viz[S] = 1;
    while(first < last) {
        int x = q[first++];
        if(x==D) continue;
        for(auto y: m[x]) {
            if(!viz[y] && f[x][y] < c[x][y]) {
                q[last++] = y; viz[y]=1; p[y] = x;
            }
        }
    }
    return viz[D];
}

void update(int S, int D) {
    for(auto y: m[D]) {
        if(f[y][D] < c[y][D] && viz[y]) {
            p[D] = y; flux = inf;
            int curr = D;
            while(curr!=S) {
                if(c[p[curr]][curr] - f[p[curr]][curr] < flux) {
                    flux = c[p[curr]][curr] - f[p[curr]][curr];
                }
                if(!flux) break;
                curr = p[curr];
            }
            curr = D;
            while(curr != N) {
                f[p[curr]][curr] += flux;
                f[curr][p[curr]] -= flux;
                curr = p[curr];
            }
            rez += flux;
        }
    }
}

void flow(int S, int D) {
    while(true) {
        if(!bfs(S,D)) break;
        update(S,D);
    }
}

int main() {
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;++i) {
        scanf("%d%d%d",&x,&y,&z);
        m[x].push_back(y);
        m[y].push_back(x);
        c[x][y] = z;
    }
    flow(1,N);
    printf("%d",rez);
    return 0;
}