Cod sursa(job #2476018)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 17 octombrie 2019 21:51:20
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

//Edmond Karps algorithm

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

const int NMAX = 1007;

int pred[NMAX];
int flow[NMAX][NMAX];
int cap[NMAX][NMAX];
vector< int > g[NMAX];

int main()
{
    int n, m; cin >> n >> m;
    int x, y, c;
    for(int i = 0; i < m; i++) {
        cin >> x >> y >> c;
        g[x].push_back(y);
        g[y].push_back(x);
        cap[x][y] += c;
    }

    int sumflow = 0;
    do {
        queue< int > q;
        q.push(1);
        for(int i = 0; i <= n; i++) pred[i] = 0;
        pred[1] = 1;

        while(!q.empty()) {
            int curr = q.front();
            q.pop();

            for(int i = 0; i < g[curr].size(); i++) {
                if(pred[g[curr][i]] == 0 && /*g[curr][i] != 1 &&*/ cap[curr][g[curr][i]] > flow[curr][g[curr][i]]) {
                    pred[g[curr][i]] = curr;
                    q.push(g[curr][i]);
                }
            }
        }

        if(pred[n] != 0) {
            int df = 1e9+7;
            for(int poz = n; poz != 1; poz = pred[poz]) {
                df = min(df, cap[pred[poz]][poz] - flow[pred[poz]][poz]);
            }

            for(int poz = n; poz != 1; poz = pred[poz]) {
                flow[pred[poz]][poz] += df;
                flow[poz][pred[poz]] -= df;
            }

            sumflow += df;
        }

    } while(pred[n] != 0);

    cout << sumflow;
}