Cod sursa(job #3039782)

Utilizator Bogdan405Mocrei Bogdan Bogdan405 Data 28 martie 2023 20:59:37
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>

using namespace std;

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

const int Nmax=3e4;
int n,m,x[Nmax],y[Nmax],C[Nmax],urm[Nmax],L[1002],k=-1,flow,c[1002],Min,p[1002],lev[1002],t[1002];
bool viz[1002];

void Add(int x1, int x2, int cap)
{
    urm[++k]=L[x1];
    x[k]=x1;
    y[k]=x2;
    C[k]=cap;
    L[x1]=k;
}

bool BFS()
{
    int inc,sf,nc,i,z;
    for (i=1;i<=n;i++)
        viz[i]=0;
    inc=sf=c[1]=viz[1]=lev[1]=1;
    while (inc<=sf)
    {
        nc=c[inc];
        z=L[nc];
        while (z!=-1)
        {
            if (!viz[y[z]] and C[z]>0)
            {
                viz[y[z]]=1;
                c[++sf]=y[z];
                lev[y[z]]=lev[nc]+1;
            }
            z=urm[z];
        }
        inc++;
    }
    return viz[n];
}

int DFS(int nc, int pushed)
{
    if (pushed==0)
        return 0;
    if (nc==n)
        return pushed;
    int Min;
    int &z=p[nc];
    while (z!=-1)
    {
        if (lev[nc]+1==lev[y[z]] and C[z]>0)
        {
            Min=DFS(y[z],min(pushed,C[z]));
            if (Min)
            {
                C[z]-=Min;
                C[z^1]+=Min;
                return Min;
            }
        }
        z=urm[z];
    }
    return 0;
}

int main()
{
    int i,x1,x2,cap,pushed;
    f >> n >> m;
    for (i=1;i<=n;i++)
        L[i]=-1;
    for (i=1;i<=m;i++)
    {
        f >> x1 >> x2 >> cap;
        Add(x1,x2,cap);
        Add(x2,x1,0);
    }
    while (BFS())
    {
        for (i=1;i<=n;i++)
            p[i]=L[i];
        do
        {
            pushed=DFS(1,2e9);
            flow+=pushed;
        }while (pushed);
    }
    g << flow;
    return 0;
}