Cod sursa(job #1566194)

Utilizator serbanSlincu Serban serban Data 11 ianuarie 2016 20:43:43
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

vector<int> V[1005];
int c[1005][1005];
int f[1005][1005];
int maxFlow, n;

vector<int> what;
queue<int> q;
int prec[1005];
void bfs() {
    prec[1] = -1; q.push(1); //start
    while(!q.empty()) {
        int cur = q.front(); q.pop();
        for(int j = 0; j < V[cur].size(); j ++) {
            int i = V[cur][j];
            if(c[cur][i] > f[cur][i] && !prec[i]) {
                prec[i] = cur;
                if(c[i][n] > f[i][n]) what.push_back(i);
                else q.push(i);
            }
        }
    }
}

int main()
{
    ifstream d("maxflow.in");
    ofstream g("maxflow.out");

    int m, x, y, z; d >> n >> m;
    for(int i = 1; i <= m; i ++) {
        d >> x >> y >> z;
        c[x][y] = z;
        V[x].push_back(y);
        V[y].push_back(x);
    }

    while(true) {
        bfs();
        if(!what.size()) break;
        while(!what.empty()) {
            int j = what[what.size() - 1]; what.pop_back();
            int cur = c[j][n] - f[j][n];
            for(int i = j; prec[i] != -1; i = prec[i])
                cur = min(cur, c[prec[i]][i] - f[prec[i]][i]);
            f[j][n] += cur; f[n][j] -= cur;
            for(int i = j; prec[i] != -1; i = prec[i]) {
                f[prec[i]][i] += cur;
                f[i][prec[i]] -= cur;
            }
            maxFlow += cur;
        }
        for(int i = 1; i <= n; i ++) prec[i] = 0;
    }
    g << maxFlow << "\n";
    return 0;
}