Cod sursa(job #2524575)

Utilizator Rares31100Popa Rares Rares31100 Data 15 ianuarie 2020 21:22:15
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>
#define Inf 2000000001

using namespace std;

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

int n,m;
vector <int> gf[1001],tree[1001];
int cap[1001][1001],flow[1001][1001];

bitset <1001> viz;
queue <int> c;

int drum[1001];
int sum;

bool bfs()
{
    for(int i=1;i<=n;i++)
    {
        viz[i]=0;
        if(tree[i].size())
            tree[i].resize(0);
    }

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

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

        for(auto vec:gf[nod])
            if(vec==n && cap[nod][n]-flow[nod][n]>0)
            {
                tree[nod].push_back(n);
                viz[n]=1;
            }
            else if(!viz[vec] && cap[nod][vec]-flow[nod][vec]>0)
            {
                tree[nod].push_back(vec);
                viz[vec]=1;
                c.push(vec);
            }
    }

    return viz[n];
}

void updateFlow(int t)
{
    int minim=Inf;

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

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

    sum+=minim;
}

bool dfs(int nod=1,int poz=1)
{
    drum[poz]=nod;

    if(nod==n)
    {
        updateFlow(poz);
        return true;
    }

    bool found=0;
    for(auto vec:tree[nod])
        if(cap[nod][vec]-flow[nod][vec]>0)
        {
            found=dfs(vec,poz+1);
            if(found)
                return true;
        }
}

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

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

        gf[i].push_back(j);
        cap[i][j]=cp;
    }

    while(bfs()==true)
        while(dfs()==true);

    out<<sum;
}