Cod sursa(job #2939090)

Utilizator rares1012Rares Cautis rares1012 Data 12 noiembrie 2022 23:39:34
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
#define MAXN 10001
#define MAXINT 1000000000

using namespace std;

vector<int> flow[MAXN][2];

queue<int> q;
int pred[MAXN];

inline void reset(){
    q = queue<int>();
    for(int i = 0; i < MAXN; i++){
        pred[i] = -1;
    }
}

int edmonds_karp(int s, int t) {
    q.push(s);

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

        for(int i = 0; i < flow[u][0].size(); i++){
            int v = flow[u][0][i];
            int c = flow[u][1][i];

            if(c > 0 && pred[v] == -1){
                pred[v] = u;
                q.push(v);
            }
        }
    }

    if(pred[t] == -1){
        return 0;
    }

    int min = MAXINT;
    int v = t;
    while(v != s){
        int u = pred[v];
        for(int i = 0; i < flow[u][0].size(); i++){
            if(flow[u][0][i] == v){
                if(flow[u][1][i] < min){
                    min = flow[u][1][i];
                }
                break;
            }
        }
        v = u;
    }

    v = t;
    while(v != s){
        int u = pred[v];
        for(int i = 0; i < flow[u][0].size(); i++){
            if(flow[u][0][i] == v){
                flow[u][1][i] -= min;
                break;
            }
        }
        for(int i = 0; i < flow[v][0].size(); i++){
            if(flow[v][0][i] == u){
                flow[v][1][i] += min;
                break;
            }
        }
        v = u;
    }

    return min;
}

int main()
{
    int n, m;
    ifstream inFile;
    ofstream outFile;

    inFile.open("maxflow.in");
    outFile.open("maxflow.out");

    inFile >> n >> m;

    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        inFile >> a >> b >> c;
        flow[a][0].push_back(b);
        flow[a][1].push_back(c);
        flow[b][0].push_back(a);
        flow[b][1].push_back(0);
    }

    int maxFlow = 0;

    while(true){
        reset();
        int f = edmonds_karp(1, n);
        if(f == 0){
            break;
        }
        else{
            maxFlow += f;
        }
    }

    outFile << maxFlow << endl;
}