Cod sursa(job #1314554)

Utilizator retrogradLucian Bicsi retrograd Data 11 ianuarie 2015 23:14:24
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include<fstream>
#include<vector>
#include<queue>
#define MAXN 1001
#define INF 125000

using namespace std;

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

int G[MAXN][MAXN];
vector<int> L[MAXN];
queue<int> Q;
int n, m, source, destination;

vector<bool> VIZ;
vector<int> PARENT;

void afis(vector<int> &v) {
    for(int i=0; i<v.size(); i++) {
        fout<<v[i]<<" ";
    }fout<<endl;
}

void read() {
    fin>>n>>m;
    int a, b;
    VIZ.resize(n+1, false);
    PARENT.resize(n+1, 0);

    source = 1;
    destination = n;

    for(int i=1; i<=m; i++) {
        fin>>a>>b;
        fin>>G[a][b];
        L[a].push_back(b);
        L[b].push_back(a);
    }

}

bool bfs(int src, int dest) {
    VIZ[src] = true;
    while(!Q.empty()) Q.pop();
    Q.push(src);
    int node;

    while(!Q.empty()) {
        node = Q.front();
        Q.pop();
        for(int i=0; i<L[node].size(); i++) {
            if(G[node][L[node][i]] * (VIZ[L[node][i]]-1)) {
                PARENT[L[node][i]] = node;
                Q.push(L[node][i]);
                VIZ[L[node][i]] = true;
            }
        }
    }

    return VIZ[dest];
}

void res() {
    for(int i=0; i<L[destination].size(); i++) {

        int node = L[destination][i];
        int MIN = G[node][destination];
        if(MIN == 0) continue;
        //afis(PARENT);

        while(PARENT[node]) {
            MIN = min(MIN, G[PARENT[node]][node]);
            node = PARENT[node];
        }

        node = L[destination][i];
        G[node][destination] -= MIN;
        G[destination][node] += MIN;
        while(PARENT[node]) {
            G[PARENT[node]][node] -= MIN;
            G[node][PARENT[node]] += MIN;
            node = PARENT[node];
        }
    }
}

int main() {
    read();

    while(bfs(source, destination)) {
        res();
        for(int i=1; i<=n; i++) {
            VIZ[i] = false;
            PARENT[i] = 0;
        }
    }

    int flux = 0;
    for(int i=0; i<L[source].size(); i++) {
        flux += G[L[source][i]][source];
    }
    fout<<flux;

    return 0;
}