Cod sursa(job #3039664)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 28 martie 2023 19:09:11
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <bits/stdc++.h>
#define N 1011
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
struct muchie
{
    int nod,cap,flow,rev;
};
vector <muchie> v[N];
int lvl[N],n;
bool bfs()
{
    queue <int> q;
    memset(lvl,0,sizeof(lvl));
    q.push(1);
    lvl[1]=1;
    while(!q.empty())
    {
       int k=q.front();
       q.pop();
       for(auto x=v[k].begin();x<v[k].end();x++)
       {
           muchie it=*x;
           if(lvl[it.nod]==0 && it.flow<it.cap)
                {
                    lvl[it.nod]=lvl[k]+1;
                    q.push(it.nod);
                }
       }
    }
    return lvl[n];
}
int dfs(int k,int flow,int next[])
{
    if(k==n)
        return flow;
    for(;next[k]<v[k].size();next[k]++)
    {
        if(lvl[v[k][next[k]].nod]==lvl[k]+1 && v[k][next[k]].cap>v[k][next[k]].flow)
        {
            int curr_flow=min(flow,v[k][next[k]].cap-v[k][next[k]].flow);
            int temp_flow=dfs(v[k][next[k]].nod,curr_flow,next);
            if(temp_flow)
            {
                v[k][next[k]].flow+=temp_flow;
                v[v[k][next[k]].nod][v[k][next[k]].rev].flow-=temp_flow;
                return temp_flow;
            }
        }
    }
}
int Dinic()
{
    int total_flow=0;
    while(bfs())
    {
        int *next=new int[n+1]{0};
        while(int flow=dfs(1,2000000001,next))
            total_flow+=flow;
        delete[] next;
    }
    return total_flow;
}
int m,x,y,z,i;
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>z;
        v[x].push_back({y,z,0,(int)v[y].size()});
        v[y].push_back({x,0,0,(int)v[x].size()});
    }
    g<<Dinic();
    return 0;
}