Cod sursa(job #1239434)

Utilizator timicsIoana Tamas timics Data 9 octombrie 2014 00:21:10
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;
int flux,x,y,z,M,N,rez,c[1100][1100],f[1100][1100],q[1100],first,last,p[1100];
vector<int> m[1100];
bool viz[1100];

inline void add(int x) {
    q[last] = x;
    ++last;
}

inline void clear() {
    first = 0, last = 0;
}

inline int size() {
    return last - first;
}

inline int pop() {
    int x = q[first];
    ++first;
    return x;
}

inline void reset_stuff() {
    clear();
    flux = 110000;
    for(int i = 1; i <= N; ++i) {
        viz[i] = 0;
        p[i] = 0;
    }
}

inline bool bfs() {
    bool ret = false;
    reset_stuff();
    add(1);
    viz[1] = 1;
    while(size()) {
        int x = pop();
        for(int i = 0; i < m[x].size(); ++i) {
            int y = m[x][i];
            if(!viz[y] && f[x][y] < c[x][y]) {
                add(y);
                viz[y]=1;
                p[y] = x;
                if(y==N) {
                    ret = true;
                    break;
                }
            }
        }
        if(ret) {
            break;
        }
    }
    if(ret) {
        int curr = N;
        while(p[curr]) {
            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];
        }
        if(!flux) {
            return false;
        }
        curr = N;
        while(p[curr]) {
            f[p[curr]][curr] += flux;
            f[curr][p[curr]] -= flux;
            curr = p[curr];
        }
    }
    return ret;
}

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;
    }
    while(true) {
        if(!bfs()) {
            break;
        }
        rez += flux;
    }
    printf("%d",rez);
    return 0;
}