Cod sursa(job #2525050)

Utilizator Rares31100Popa Rares Rares31100 Data 16 ianuarie 2020 18:57:07
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>
#define Inf 2000000001

using namespace std;

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

int n,m,c,sum;
int vf[10001],urm[10001],last[1001],nr;
int cap[1001][1001],flow[1001][1001];
bitset <1001> viz;

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

int dfs(int nod=1,int minFlow=Inf)
{
    int found=0;
    viz[nod]=1;

    if(nod==n)
    {
        sum+=minFlow;
        viz[nod]=0;

        return minFlow;
    }

    for(int k=last[nod];k && !found;k=urm[k])
        if(!viz[ vf[k] ])
        {
            if(cap[ nod ][ vf[k] ]-flow[ nod ][ vf[k] ]>=c)
            {
                found=dfs(vf[k], min(minFlow,cap[ nod ][ vf[k] ]-flow[ nod ][ vf[k] ]) );
                flow[ nod ][ vf[k] ]+=found;
            }
            else if(flow[ vf[k] ][ nod ]>=c)
            {
                found=dfs(vf[k], min(minFlow,flow[ vf[k] ][ nod ]) );
                flow[ vf[k] ][ nod ]-=found;
            }
        }

    viz[nod]=0;

    return found;
}

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

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

        cap[i][j]=ct;
        adauga(i,j);
        adauga(j,i);

        c=max(c,ct);
    }

    for(;c;c/=2)
        while(dfs());

    out<<sum;

    return 0;
}