Cod sursa(job #2959826)

Utilizator Paul12PPaul Dumitru Paul12P Data 2 ianuarie 2023 19:32:25
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define MAXN 1001
#define INF 999999
using namespace std;
int capacity[MAXN][MAXN];
int capacityin[MAXN][MAXN];
int n;
vector<vector<int>>adj;
int bfs(int s,int f,vector<int>&parent){
    fill(parent.begin(),parent.end(),-1);
    int tm=0;
    queue<pair<int,int>> q;
    parent[s]=-2;
    q.push({s,INF});
    while(!q.empty()){
        int cur=q.front().first;
        int flow=q.front().second;
        q.pop();
        for(auto el:adj[cur]){
            if(parent[el]==-1 && capacity[cur][el]){
                parent[el]=cur;
                int new_flow=min(flow,capacity[cur][el]);
                if(el==f)
                    return new_flow;
                q.push({el,new_flow});
            }
            else if(parent[el]==-1 && capacity[cur][el]==0)
                tm+=capacityin[cur][el];
        }
    }
    return 0;
}
int max_flow(int source,int sink){
    int maxflow=0;
    vector<int>parent(n+1);
    int flow;
    while(flow=bfs(source,sink,parent)){
        maxflow+=flow;
        int cur=sink;
        while(cur!=source){
            int prev=parent[cur];
            capacity[cur][prev]+=flow;
            capacity[prev][cur]-=flow;
            cur=prev;
        }
    }
    return maxflow;
}
int main() {
    int m,u,v,c,i,mx;
    ifstream cin("maxflow.in");
    ofstream cout("maxflow.out");
    cin>>n>>m;
    adj.resize(n+1);
    for(i=1;i<=m;i++){
        cin>>u>>v>>c;
        capacity[u][v]=c;
        capacityin[u][v]=c;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    mx=max_flow(1,n);
    cout<<mx;
    cin.close();
    cout.close();
}