Cod sursa(job #1268151)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 20 noiembrie 2014 17:39:10
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#define MAXN 1000
#define MAXM 5000
#include <queue>
#include <vector>

using namespace std;

int N, M, x, y, c, maxf = 0;
vector<int> G[MAXN + 1];
int cap[MAXN + 1][MAXN + 1];
int flux[MAXN + 1][MAXN + 1];
bool viz[MAXN + 1];
int pred[MAXN + 1];
vector<int>::iterator it;

bool bfs(int node) {
    queue<int> q;
    q.push(node);
    viz[q.front()] = 1;
    while(!q.empty()) {
        int cur = q.front();
        q.pop();
        for(it = G[cur].begin(); it != G[cur].end(); ++it) {
            if(!viz[*it] && cap[cur][*it] - flux[cur][*it] > 0) {
                pred[*it] = cur;
                viz[*it] = 1;
                q.push(*it);
                if(*it == N)
                    return 1;
            }
        }
    }
    return 0;
}

void change_flow() {
    int fmin, nod = N;
    fmin = (1LL << 30) - 1;
    while(pred[nod]) {
        if(cap[pred[nod]][nod] - flux[pred[nod]][nod] < fmin) {
            fmin = cap[pred[nod]][nod] - flux[pred[nod]][nod];
        }
        nod = pred[nod];
    }
    nod = N;
    while(pred[nod]) {
        flux[pred[nod]][nod] += fmin;
        //G[nod].push_back(pred[nod]);
        flux[nod][pred[nod]] -= fmin;
        nod = pred[nod];
    }
    maxf += fmin;
}

int main() {

    //std::ios_base.sync_with_stdio(false);

    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");

    cin >> N >> M;
    for(int i = 1; i <= M; ++i) {
        cin >> x >> y >> c;
        G[x].push_back(y);
        G[y].push_back(x);
        cap[x][y] = c;
    }
    while(bfs(1)) {
        change_flow();
        for(int i = 1; i <= N; ++i)
            viz[i] = pred[i] = 0;
    }

    cout << maxf;

    return 0;
}