Cod sursa(job #2960520)

Utilizator adamemi02emanuel adam adamemi02 Data 4 ianuarie 2023 16:07:52
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb

#include <fstream>
#include <vector>
#include <queue>
using namespace std;
int capacity[1001][1001];
int m,nod1,nod2,capacitate,i,n;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
vector<vector<int>>adj;
int bfs(int start,int final,vector<int>&parent){
    for(int i=0;i<parent.size();i++)
        parent[i]=-1;
    queue<pair<int,int>> q;
    parent[start]=-2;
    q.push({start,110001});
    while(!q.empty()){
        int curent=q.front().first;
        int flow=q.front().second;
        q.pop();
        for(auto element:adj[curent]){
            if(parent[element]==-1 && capacity[curent][element]){
                parent[element]=curent;
                int new_flow=min(flow,capacity[curent][element]);
                if(element==final)
                    return new_flow;
                q.push({element,new_flow});
            }
        }
    }
    return 0;
}
int max_flow(int start,int final ){
    int maxflow=0;
    vector<int>parent(n+1);
    int flow;
    while(bfs(start,final,parent)){
        maxflow=maxflow+flow;
        int curent=final;
        while(curent!=start){
            int prev=parent[curent];
            capacity[curent][prev]=capacity[curent][prev]+flow;
            capacity[prev][curent]=capacity[curent][prev]-flow;
            curent=prev;
        }
    }
    return maxflow;
}
int main() {
    cin>>n>>m;
    adj.resize(n+1);
    for(i=1;i<=m;i++){
        cin>>nod1>>nod2>>capacitate;
        capacity[nod1][nod2]=capacitate;
        adj[nod1].push_back(nod2);
        adj[nod2].push_back(nod1);
    }
    cout<<max_flow(1,n);

}