Cod sursa(job #2524501)

Utilizator Rares31100Popa Rares Rares31100 Data 15 ianuarie 2020 20:14:52
Problema Flux maxim Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 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];
int cap[1001][1001],flow[1001][1001];

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

int tree[1001];
int frunza[1001];
int drum[1001];
int sum;

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

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

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

        if(nod==n)
            continue;

        frunza[nod]=1;

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

                if(vec!=n)
                    frunza[nod]=0;
            }
    }

    for(int i=1;i<=n-1;i++)
        if(frunza[i] && cap[i][n]-flow[i][n]==0)
            frunza[i]=0;

    return viz[n];
}

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)
    {
        for(int i=1;i<=n-1;i++)
            if(frunza[i])
            {
                int t=0,poz=i;
                drum[++t]=n;

                while(poz)
                {
                    drum[++t]=poz;
                    poz=tree[poz];
                }

                int minim=Inf;

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

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

                sum+=minim;
            }
    }

    out<<sum;

    return 0;
}