Cod sursa(job #2583491)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 18 martie 2020 13:18:00
Problema Flux maxim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
int level[1003],r[1003][1003],viz[1003],n;
vector <int> v[1003];
//vector <int> cap[1003];
int q[1003];
bool bfs (int S, int D)
{
    int st=1,dr=0;
    q[++dr]=S;
    viz[S]=1;
    level[S]=0;
    while(st<=dr)
    {
        int pz=q[st++];
        for(int i=0;i<v[pz].size();++i)
            if(!viz[v[pz][i]] && r[pz][v[pz][i]]>0)
            {
                q[++dr]=v[pz][i];
                level[v[pz][i]]=level[pz]+1;
                viz[v[pz][i]]=1;
            }
    }
    return viz[D];
}
int dfs (int pz, int D, int flow)
{
    if(pz==D)
        return flow;
    for(int i=0;i<v[pz].size();++i)
    {
        if(!viz[v[pz][i]] && level[v[pz][i]]==1+level[pz] && r[pz][v[pz][i]]>0)
        {
            int rzc=dfs(v[pz][i],D,min(flow,r[pz][v[pz][i]]));
            if(rzc)
            {
                r[pz][v[pz][i]]-=rzc;
                r[v[pz][i]][pz]+=rzc;
                return rzc;
            }
            viz[v[pz][i]]=0;
        }
    }
    return 0;
}
int maxflow (int S, int D)
{
    int rez=0;
    while(bfs(S,D))
    {
        for(int i=1;i<=n;++i)
            viz[i]=0;
        int cur;
        while(cur=dfs(S,D,200003))
        {
            rez+=cur;
            for(int i=1;i<=n;++i)
                viz[i]=0;
        }
    }
    return rez;
}
int main()
{
    int i,j,m,k=0;
    cin>>n>>m;
    for(i=1;i<=m;++i)
    {
        int a,b,c;
        cin>>a>>b>>c;
        v[a].push_back(b);
        //cap[a].push_back(c);
        r[a][b]=c;
    }
    cout<<maxflow(1,n);
    return 0;
}