Cod sursa(job #1274043)

Utilizator PaueyPaula Nicoleta Gradu Pauey Data 23 noiembrie 2014 10:43:00
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#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];
int pred[MAXN + 1];
queue<int> q;
vector<int>::iterator it;

bool is_path() {
    for(int i = 1; i <= N; ++i)
      pred[i] = 0;
    q.push(1);
    pred[1] = 1;
    while(!q.empty()) {
        if(q.front() == N) {
            q.pop();
            continue;
        }
        for(it = G[q.front()].begin(); it!=G[q.front()].end(); ++it)
            if(!pred[*it] && flux[q.front()][*it] < cap[q.front()][*it]) {
                q.push(*it);
                pred[*it] = q.front();
            }
        q.pop();
    }
    if(pred[N])
        return 1;
    return 0;
}

int main() {

    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(is_path()) {
         for(it = G[N].begin(); it != G[N].end(); ++it)
            if(flux[*it][N] < cap[*it][N] && pred[*it]) {
                int fluxx = cap[*it][N] - flux[*it][N], nod = *it;
                while(nod != 1)
                {
                    fluxx = min(fluxx, cap[pred[nod]][nod] - flux[pred[nod]][nod]);
                    nod = pred[nod];
                }
                nod = *it;
                flux[*it][N] += fluxx;
                flux[N][*it] -= fluxx;
                while(nod != 1) {
                    flux[pred[nod]][nod] += fluxx;
                    flux[nod][pred[nod]] -= fluxx;
                    nod = pred[nod];
                }
                maxf += fluxx;
            }
    }

    cout << maxf;

    return 0;
}