Cod sursa(job #2520422)

Utilizator Rares31100Popa Rares Rares31100 Data 9 ianuarie 2020 13:44:08
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
#define Nod first
#define Lev second

using namespace std;

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

int n,m;
int vf[5001],urm[5001],last[5001],nr;
int cap[5001],flow[5001];
int level[5001];
int muchie[5001],t;
bitset <5001> pass,viz;
int sum=0;

void adauga(int nod,int vec,int cp)
{
    vf[++nr]=vec;
    urm[nr]=last[nod];
    last[nod]=nr;

    cap[nr]=cp;
}

queue <int> c;

bool bfsLv()
{
    for(int i=1;i<=n;i++)
        viz[i]=0;

    c.push(1);
    level[1]=0;
    viz[1]=1;

    while(!c.empty())
    {
        int nod=c.front();
        c.pop();

        for(int k=last[nod];k;k=urm[k])
            if(!viz[ vf[k] ] && cap[k]-flow[k]>0)
            {
                level[ vf[k] ]=level[nod]+1;
                viz[ vf[k] ]=1;
                pass[ vf[k] ]=1;

                c.push(vf[k]);
            }
    }

    return viz[n];
}

bool dfs(int nod=1,int poz=1)
{
    bool found=0;

    if(nod==n)
    {
        t=poz-1;
        return true;
    }

    for(int k=last[nod];k && !found;k=urm[k])
        if(pass[ vf[k] ]==1 && level[nod]+1==level[ vf[k] ] && cap[k]-flow[k]>0)
        {
            muchie[poz]=k;
            found=dfs(vf[k],poz+1);
        }

    if(!found)
        pass[nod]=0;

    return found;
}

int main()
{
    in>>n>>m;

    for(int i,j,cp,k=1;k<=m;k++)
    {
        in>>i>>j>>cp;

        adauga(i,j,cp);
    }

    while(bfsLv()==true)
    {
        while(dfs()==true)
        {
            int minim=cap[ muchie[1] ]-flow[ muchie[1] ];

            for(int i=2;i<=t;i++)
                minim=min(minim,cap[ muchie[i] ]-flow[ muchie[i] ]);

            for(int i=1;i<=t;i++)
                flow[ muchie[i] ]+=minim;

            sum+=minim;
        }
    }

    out<<sum;

    return 0;
}