Cod sursa(job #2938566)

Utilizator popescuadrianpopescuadrian popescuadrian Data 12 noiembrie 2022 11:23:12
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.1 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
vector <int>adj[1005];
int cap[1005][1005];
int flow[1005][1005];
int fre[1005];
int par[1005];
queue<int>qu;
int bfs(int n)
{
    int 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()
{
    int n,i,j,k,l,a,b,x,m,curr;
    int inf=1e7;
    long long maxflow=0;
    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)
            {
                int 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];
                    }
                }
                maxflow=maxflow+flux;
                //break;
            }
        }
        for(i=1; i<=n; i++)
        {
            fre[i]=0;
        }
    }
    cout<<maxflow;
    return 0;
}