Cod sursa(job #1566172)

Utilizator serbanSlincu Serban serban Data 11 ianuarie 2016 20:31:39
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 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;

queue<int> q;
int prec[1005];
bool bfs() {
    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] && c[cur][i] > f[cur][i] && !prec[i]) {
                prec[i] = cur, q.push(i);
                if(i == n) {
                    while(!q.empty()) q.pop();
                    return true;
                }
            }
        }
    }
    return false;
}

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(bfs()) {
        int cur = c[prec[n]][n] - f[prec[n]][n];
        for(int i = prec[n]; prec[i]; i = prec[i])
            cur = min(cur, c[prec[i]][i] - f[prec[i]][i]);
        for(int i = n; prec[i]; i = prec[i]) {
            f[prec[i]][i] += cur;
            f[i][prec[i]] -= cur;
        }
        for(int i = 1; i <= n; i ++) prec[i] = 0;
        maxFlow += cur;
    }
    g << maxFlow << "\n";
    return 0;
}