Cod sursa(job #2705735)

Utilizator adiaioanaAdia R. adiaioana Data 13 februarie 2021 11:04:59
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>

#define pb push_back
#define INF 1e9

using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");

int n,m, x, y , z, f[1010][1010], viz[1010], T[1010], fmn, ans,nod;
vector <int> G[1010];
queue <int> q;

bool bfs();
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>n>>m;
    for(int i=1; i<=m; ++i)
    {
        cin>>x>>y>>z;
        f[x][y]=z;
        G[x].pb(y);
        G[y].pb(x);
    }

    while(bfs())
    {
        for(auto an:G[n])
        {
            if(!viz[an] || !f[an][n])
                continue;
            T[n]=an;

            fmn=INF;
            for(int nod=n; nod!=1; nod=T[nod])
                fmn=min(fmn, f[T[nod]][nod]);
            for(int nod=n; nod!=1; nod=T[nod])
                f[T[nod]][nod]-=fmn, f[nod][T[nod]]+=fmn;

            ans+=fmn;
        }
    }

    cout<<ans<<'\n';
    return 0;
}

bool bfs()
{
    q.push(1);
    memset(viz,0,sizeof(viz));

    while(!q.empty())
    {
        nod=q.front(); q.pop();
        if(nod==n)
            continue;
        for(auto nn:G[nod])
        {
            if(viz[nn] || f[nod][nn]==0)
                continue;
            q.push(nn);
            viz[nn]=1;
            T[nn]=nod;
        }
    }

    return viz[n];
}