Cod sursa(job #1657433)

Utilizator Burbon13Burbon13 Burbon13 Data 20 martie 2016 14:56:09
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <cstdio>
#include <queue>
#include <bitset>
#include <vector>

using namespace std;

const int inf = 0x3f3f3f3f;
const int nmx = 1002;

int n,m,capacitate[nmx][nmx],flux[nmx][nmx],tata[nmx],total;
vector <int> g[nmx];
bitset <nmx> viz;
queue <int> q;

void citire(){
    scanf("%d %d", &n, &m);
    int nod1,nod2,cost;
    for(int i = 1; i <= m; ++i){
        scanf("%d %d %d", &nod1, &nod2, &cost);
        capacitate[nod1][nod2] = cost;
        g[nod1].push_back(nod2);
        g[nod2].push_back(nod1);
    }
}

bool bfs(){
    viz.reset();
    viz[1] = true;
    q.push(1);
    while(not q.empty()){
        int nod = q.front();
        q.pop();
        if(nod == n)
            continue;
        for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it){
            if(viz[*it] || capacitate[nod][*it] == flux[nod][*it])
                continue;
            viz[*it] = true;
            tata[*it] = nod;
            q.push(*it);
        }
    }
    return viz[n];
}

int main(){
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    citire();
    while(bfs())
        for(vector<int>::iterator it = g[n].begin(); it != g[n].end(); ++it){
            if(capacitate[*it][n] == flux[*it][n] || not viz[*it])
                continue;
            tata[n] = *it;
            int minim = inf, nod = n;
            while(nod != 1){
                minim = min(minim,capacitate[tata[nod]][nod] - flux[tata[nod]][nod]);
                nod = tata[nod];
            }
            nod = n;
            while(nod != 1){
                flux[tata[nod]][nod] += minim;
                flux[nod][tata[nod]] -= minim;
                nod = tata[nod];
            }
            total += minim;
        }
    printf("%d\n", total);
    return 0;
}