Cod sursa(job #1566155)

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

using namespace std;

int c[1005][1005];
int f[1005][1005];
int maxFlow, n;

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 i = 1; i <= n; i ++) {
            if(c[cur][i] > f[cur][i] && !prec[i])
                prec[i] = cur, 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;
    }

    while(true) {
        bfs();
        if(!prec[n]) break;
        int cur = c[prec[n]][n] - f[prec[n]][n];
        for(int i = prec[n]; prec[i] != -1; i = prec[i])
            cur = min(cur, c[prec[i]][i] - f[prec[i]][i]);
        for(int i = n; prec[i] != -1; 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;
}