Cod sursa(job #870182)

Utilizator mihai995mihai995 mihai995 Data 2 februarie 2013 22:45:56
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int N = 1001;

int cap[N][N], flux[N][N], T[N], n;
bool use[N];

vector<int> graph[N];
queue<int> Q;

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

void get_graph(){
    int m, x, y, c;

    in >> n >> m;

    while (m--){
        in >> x >> y >> c;
        cap[x][y] = c;

        graph[x].push_back(y);
        graph[y].push_back(x);
    }
}

inline int augment(int x, int y){
    return cap[x][y] - flux[x][y];
}

bool bfs(int S, int D){
    memset(T, 0, sizeof(T));
    memset(use, false, sizeof(use));

    Q.push(S);
    use[S] = true;
    int x;

    while (!Q.empty()){
        x = Q.front();
        Q.pop();

        if (x == D)
            continue;

        for (vector<int> :: iterator it = graph[x].begin() ; it != graph[x].end() ; it++)
            if (!use[*it] && augment(x, *it)){
                use[*it] = true;

                Q.push(*it);

                T[*it] = x;
            }
    }

    return use[D];
}

int maxFlow(int S, int D){
    int F = 0;

    while (bfs(S, D))
        for (int x = 1 ; x <= n ; x++){
            if (!use[x] || !augment(x, D))
                continue;

            int add = augment(x, D);

            for (int i = x ; i != S ; i = T[i])
                add = min(add, augment(T[i], i));

            T[D] = x;
            F += add;

            for (int i = D ; i != S ; i = T[i]){
                flux[ T[i] ][i] += add;
                flux[i][ T[i] ] -= add;
            }
        }

    return F;
}

int main(){
    get_graph();

    out << maxFlow(1, n) << "\n";

    return 0;
}