Cod sursa(job #2524623)

Utilizator Rares31100Popa Rares Rares31100 Data 15 ianuarie 2020 22:25:44
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <bits/stdc++.h>
#define Inf (int)(1<<30)

using namespace std;

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

int n,m;
int vf[5001],urm[5001],last[5001],nr;
int cap[1001][1001],flow[1001][1001];
bitset <1001> viz;
int tata[1001];
int drum[1001];
int sum;

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

bool bfs()
{
    queue <int> c;

    for(int i=1;i<=n;i++)
        viz[i]=0;

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

    while(!c.empty() && !viz[n])
    {
        int nod=c.front();
        c.pop();

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

    return viz[n];
}

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

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

        adauga(i,j);
        cap[i][j]=cp;
    }

    while(bfs()==true)
    {
        int minim=Inf;
        int t=0,poz=n;

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

        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;
}