Cod sursa(job #2886014)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 6 aprilie 2022 21:18:32
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
using T=int;
struct Dinic
{
    struct Edge
    {
        int a,b,ult;
        T flow,cap;
    };
    vector <Edge> es;
    vector <int> last,dist,coada;
    Dinic(int n)
    {
        last.assign(n+1,-1);
    }
    void AddEdge(int a,int b,T c)
    {
        es.push_back({a,b,last[a],0,c});
        last[a]=es.size()-1;
        es.push_back({b,a,last[b],0,0});
        last[b]=es.size()-1;
    }
    bool bfs(int s,int t,T pas)
    {
        coada.clear();
        dist.assign(last.size(),-1);
        dist[s]=0;
        coada.push_back(s);
        for(int i=0; i<coada.size(); i++)
        {
            int it=coada[i];
            for(int x=last[it]; x!=-1; x=es[x].ult)
            {
                if(dist[es[x].b]==-1&&es[x].cap-es[x].flow>=pas)
                {
                    dist[es[x].b]=dist[it]+1;
                    coada.push_back(es[x].b);
                }
            }
        }
        //for(int i=1;i<last.size();i++)
        //cout<<dist[i]<<" ";
        //cout<<'\n';
        return (dist[t]!=-1);
    }
    bool dfs(int s,int t,T pas)
    {
        if(s==t)
            return 1;
        for(int x=last[s]; x!=-1; x=es[x].ult)
        {
            if(dist[es[x].b]==dist[s]+1&&es[x].cap-es[x].flow>=pas)
            {
                if(dfs(es[x].b,t,pas))
                {
                    es[x].flow+=pas;
                    es[x^1].flow-=pas;
                    return 1;
                }
            }
        }
        return 0;
    }
    int Compute(int s,int t)
    {
        int pas=1<<16,rez=0;
        while(pas)
        {
            while(bfs(s,t,pas))
                while(dfs(s,t,pas))
                    rez+=pas;
            pas/=2;
        }
        return rez;
    }
};
int main()
{
    int n,m,i,a,b,c;
    in>>n>>m;
    Dinic d(n);
    for(i=1; i<=m; i++)
    {
        in>>a>>b>>c;
        d.AddEdge(a,b,c);
    }
    out<<d.Compute(1,n);
    return 0;
}