Cod sursa(job #3187240)

Utilizator The_SupremacySus Impostor The_Supremacy Data 28 decembrie 2023 11:45:06
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>

using namespace std;
const int NMAX = 1000;
vector<int>G[NMAX+5];
int capacitate[NMAX+5][NMAX+5];
int n;long long rez=0;int poz[NMAX+5];
queue<int>q;int dist[NMAX+5];
int DFS(int nod,int cap){
    if(nod==n||cap==0){return cap;}
    while(poz[nod]<G[nod].size()){
        int nod1=G[nod][poz[nod]];poz[nod]++;
        if(capacitate[nod][nod1]>0&&dist[nod1]==dist[nod]+1){
            int x=DFS(nod1,min(cap,capacitate[nod][nod1]));
            if(x!=0){
                capacitate[nod][nod1]-=x;
                capacitate[nod1][nod]+=x;return x;
            }
        }
    }
    return 0;
}
bool F_flux(){
    for(int i=1;i<=n;i++){
        poz[i]=0;dist[i]=INT_MAX;
    }
    dist[1]=0;
    q.push(1);
    while(!q.empty()){
        int nod=q.front();q.pop();
        for(int i=0;i<G[nod].size();i++){
            if(capacitate[nod][G[nod][i]]>0&&dist[G[nod][i]]>dist[nod]+1){
                dist[G[nod][i]]=dist[nod]+1;
                q.push(G[nod][i]);
            }
        }
    }
    if(dist[n]==INT_MAX){return 0;}
    long long adun=0;
    while(1){
        int ceva=DFS(1,INT_MAX);
        if(ceva==0){break;}adun+=ceva;
    }
    if(adun==0){return 0;}
    rez+=adun;return 1;
}
int main()
{
    ifstream fin("maxflow.in");
    ofstream fout("maxflow.out");
    int m,a,b,c;fin>>n>>m;
    for(int i=1;i<=m;i++){
        fin>>a>>b>>c;
        capacitate[a][b]=c;
        G[a].push_back(b);G[b].push_back(a);
    }
    while(1){
        if(F_flux()==0){break;}
    }
    fout<<rez<<'\n';
    return 0;
}