Cod sursa(job #2936362)

Utilizator rares1012Rares Cautis rares1012 Data 8 noiembrie 2022 18:46:10
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#define MAXN 10001
#define MAXINT 1000000000

using namespace std;

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

int n;

int getIndex(int node, int next){
    for(int i=0;i<edges[node][0].size();i++){
        if(edges[node][0][i]==next){
            return i;
        }
    }

    return -1;
}

int findPath(int node, int flow) {
    if(node == n)
        return flow;
    
    for(int i = 0; i < edges[node][0].size(); i++) {
        int next = edges[node][0][i];
        int cap = edges[node][1][i];
        
        if(cap > 0) {
            int pathFlow = findPath(next, min(flow, cap));
            
            if(pathFlow > 0) {
                edges[node][1][i] -= pathFlow;
                
                int nextIndex = getIndex(next, node);
                if(nextIndex == -1){
                    edges[next][0].push_back(node);
                    edges[next][1].push_back(pathFlow);
                } else {
                    edges[next][1][nextIndex] += pathFlow;
                }

                return pathFlow;
            }
        }
    }

    return -1;
}

int main()
{
    int 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;
        edges[a][0].push_back(b);
        edges[a][1].push_back(c);
    }

    int maxFlow = 0;

    while(true) {
        int pathFlow = findPath(1, MAXINT);
        if(pathFlow == -1)
            break;
        maxFlow += pathFlow;
    }

    outFile << maxFlow << endl;
}