Cod sursa(job #3038379)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 27 martie 2023 12:17:37
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

const int nmax=503;

int n,m;
vector<int> adj[nmax];
int start, fin;
map<pair<int,int>,int> cap;
bool vis[nmax];
int ret[nmax];
bool fluxBfs()
{
    memset(vis,0,sizeof(vis));
    queue<int> q;
    q.push(1);
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        //cout<<"here "<<nod<<'\n';

        if(nod==fin) continue;

        for(auto e:adj[nod]) if(!vis[e]&&cap[{nod,e}]>0)
        {
            vis[e]=1;
            ret[e]=nod;
            q.push(e);
        }
    }
    return vis[fin];
}


int augmentPath(int nod)
{
    if(nod==start) return 0;
    int flux=cap[{ret[nod],nod}];
    int cur=ret[nod];
    while(cur!=start)
    {
        flux=min(flux,cap[{ret[cur],cur}]);
        cur=ret[cur];
    }
    cur=nod;
    while(cur!=start)
    {
        cap[{ret[cur],cur}]-=flux;
        cap[{cur,ret[cur]}]+=flux;
        cur=ret[cur];
    }
    return flux;
}

int main()
{
    f>>n>>m;
    start=1,fin=n;
    int a,b,c;
    for(int i=0;i<m;i++)
    {
        f>>a>>b>>c;
        if(cap[{b,a}]==0)
        {
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
        cap[{a,b}]+=c;
    }
    int ans=0;
    while(fluxBfs())
    {
        for(auto e:adj[fin])
        {
            if(!vis[e]||cap[{e,fin}]==0) continue;

            ret[fin]=e;
            ans+=augmentPath(fin);
        }
    }
    g<<ans<<'\n';
    return 0;
}