Cod sursa(job #2885139)

Utilizator popescuadrianpopescuadrian popescuadrian Data 5 aprilie 2022 15:50:26
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>
#include <queue>

using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
queue <int>qu;
int inf=1e8,n;
int fre[1005];
int par[1005];
int cap[1005][1005];
int flux[1005][1005];
vector<int>adj[1005];
int bfs ()
{
    int curr,i,k;
    qu.push(1);
    while(qu.size())
    {
        curr=qu.front();
        qu.pop();
        if(curr!=n)
        {
            for(i=0; i<adj[curr].size(); i++)
            {
                k=adj[curr][i];
                if(cap[curr][k]!=flux[curr][k] && fre[k]==0)
                {
                    qu.push(k);
                    fre[k]=1;
                    par[k]=curr;
                }
            }
        }
    }
    if(fre[n]==1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    int i,m,k,flow,totalflow=0,a,b,w,curr;
    cin>>n>>m;
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>w;
        cap[a][b]=cap[a][b]+w;
        if(cap[a][b]+cap[b][a]==w)
        {
            adj[a].push_back(b);
            adj[b].push_back(a);
        }
    }
    int pos;
    pos=bfs();
    while(pos==1)
    {
        for(i=0; i<adj[n].size(); i++)
        {
            k=adj[n][i];
            par[n]=k;
            if(fre[k]==1 && flux[k][n]!=cap[k][n])
            {
                curr=n;
                flow=inf;
                while(curr!=1)
                {
                    flow=min(flow,cap[par[curr]][curr]-flux[par[curr]][curr]);
                    curr=par[curr];
                }
                if(flow!=0 && flow!=inf)
                {
                    curr=n;
                    while(curr!=1)
                    {
                        flux[par[curr]][curr]=flux[par[curr]][curr]+flow;
                        flux[curr][par[curr]]=flux[curr][par[curr]]-flow;
                        curr=par[curr];
                    }
                }
                totalflow=totalflow+flow;
            }
        }
        for(i=1; i<=n; i++)
        {
            fre[i]=0;
        }
        pos=bfs();
    }
    cout<<totalflow;
    return 0;
}