Cod sursa(job #2520646)

Utilizator Rares31100Popa Rares Rares31100 Data 9 ianuarie 2020 16:28:34
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
#define Inf 1000000000

using namespace std;

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

int n,m;
int vf[5001],urm[5001],last[5001],nrG;
int cap[5001],flow[5001];

int level[1001];
bitset <1001> viz,use;
int muchie[1001],drum[1001],t;

int sum;

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

    cap[nrG]=capM;
}

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

    queue <int> c;
    c.push(1);
    viz[1]=1;use[1]=1;
    level[1]=0;

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

        for(int k=last[nod];k;k=urm[k])
            if(viz[ vf[k] ]==0 && cap[k]-flow[k]>0)
            {
                viz[ vf[k] ]=1;use[ vf[k] ]=1;
                level[ vf[k] ]=level[nod]+1;
                c.push(vf[k]);
            }
    }

    return viz[n];
}

bool dfs(int nod=1,int pas=1)
{
    if(nod==n)
    {
        t=pas-1;
        return 1;
    }

    bool found=0;

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

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

    return found;
}

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

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

        adauga(i,j,capM);
    }

    while(bfs()==true)
    {
        while(dfs()==true)
        {
            int minim=Inf;

            for(int i=1;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;
}