Cod sursa(job #3305717)

Utilizator PetruApostolApostol Mihnea Petru PetruApostol Data 4 august 2025 14:17:03
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <deque>
#include <vector>
using namespace std;

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

int cost[1001][1001];
int flow[1001][1001];
int dist[1001],n;
vector<int> v[1001];
deque<int> q;
bool bfs(int in,int dest){
    int i,nod;
    for(i=1;i<=n;i++){
        dist[i]=1e9;
    }
    dist[in]=0;q.clear();q.push_back(in);
    while(!q.empty()){
        nod=q.front();q.pop_front();
        for(auto it:v[nod]){///printf("%d ",nod);
            if(cost[nod][it]>flow[nod][it] && dist[it]>dist[nod]+1){
                dist[it]=dist[nod]+1;
                q.push_back(it);
            }
        }
    }
    if(dist[dest]!=1e9) return 1;
    return 0;
}

int calc(int nod,int dest,int max1){
    if(!max1) return 0;
    if(nod==dest) return max1;
    int sum=0,cur;
    for(auto it:v[nod]){
        if(dist[it]!=dist[nod]+1) continue;
        cur=calc(it,dest,min(max1-sum,cost[nod][it]-flow[nod][it]));
        flow[nod][it]+=cur;
        flow[it][nod]-=cur;
        sum+=cur;
    }
    return sum;
}

int main()
{
    int m,rasp=0,i,a,b,c;
    cin>>n>>m;
    for(i=1;i<=m;i++){
        cin>>a>>b>>c;
        v[a].push_back(b);
        v[b].push_back(a);
        cost[a][b]+=c;
    }
    while(bfs(1,n)){
        rasp+=calc(1,n,1e9);
    }
    cout<<rasp;
    return 0;
}