Cod sursa(job #2905766)

Utilizator popescuadrianpopescuadrian popescuadrian Data 23 mai 2022 18:16:28
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <vector>
#include <queue>

using namespace std;
vector <int>adj[2005];
long long cap[2005][2005];
long long flow[2005][2005];
long long fre[2005];
long long par[2005];
queue<int>qu;
long long bfs(long long n)
{
    long long curr,i,k;
    qu.push(1);
    fre[1]=1;
    while(qu.size())
    {
        curr=qu.front();
        qu.pop();
        if(curr==n)
        {
            continue;
        }
        for(i=0; i<adj[curr].size(); i++)
        {
            k=adj[curr][i];
            if(flow[curr][k]<cap[curr][k] && fre[k]==0)
            {
                fre[k]=1;
                par[k]=curr;
                qu.push(k);
            }
        }
    }
    if(fre[n]==1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    long long n,i,j,k,l,a,b,x,m;
    long long inf=1e12;
    long long minflow=0,curr;
    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>x;
        cap[a][b]=x;
        if(cap[a][b]+cap[b][a]==x)
        {
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
    }
    while(bfs(n)==1)
    {
        for(i=0; i<adj[n].size(); i++)
        {
            k=adj[n][i];
            par[n]=k;
            if(fre[k]==1)
            {
                long long flux=inf;
                curr=n;
                while(curr!=1)
                {
                    flux=min(flux,cap[par[curr]][curr]-flow[par[curr]][curr]);
                    curr=par[curr];
                }
                if(flux!=0)
                {
                    curr=n;
                    while(curr!=1)
                    {
                        flow[par[curr]][curr]=flow[par[curr]][curr]+flux;
                        flow[curr][par[curr]]=flow[curr][par[curr]]-flux;
                        curr=par[curr];
                    }
                }
                minflow=minflow+flux;
            }
        }
        for(i=1; i<=n; i++)
        {
            fre[i]=0;
        }
    }
    cout<<minflow;
    return 0;
}