首页 > 其他分享 >网络流库

网络流库

时间:2025-01-23 10:00:47浏览次数:1  
标签:std dque int ed Flow 网络 流库 size

最大流库

使用 Dinic 实现,支持输出最小割

#include<iostream>
#ifndef DINIC_HPP

#include<vector>
#include<queue>
#include<algorithm>
#include<limits>

namespace _dinic{

namespace __detail{

using size_t=long long;

template<size_t Node_cnt,typename Flow_type=long long>
class dinic{
    struct ed_t{
        bool isori;
        size_t v,rid;
        Flow_type flo;
    };
    std::vector<ed_t> *ed;
    size_t _S,_T;
    Flow_type _ans;
    size_t *lev,*cur;
    size_t _ncnt;
    bool _bfs(){
        std::fill(lev,lev+_ncnt+1,-1);
        lev[_S]=1;
        std::queue<size_t> que;
        que.push(_S);
        while(!que.empty()){
            size_t u=que.front();
            que.pop();
            for(auto &e:ed[u]){
                if(e.flo==0) continue;
                if(lev[e.v]==-1){
                    lev[e.v]=lev[u]+1;
                    que.push(e.v);
                }
            }
        }
        return lev[_T]!=-1;
    }
    Flow_type _dfs(size_t it,Flow_type tflo){
        if(it==_T) return tflo;
        Flow_type rest=tflo;
        for(size_t &i=cur[it];i<(size_t)ed[it].size();++i){
            auto &e=ed[it][i];
            if(e.flo==0||lev[e.v]!=lev[it]+1) continue;
            Flow_type rec=_dfs(e.v,std::min(rest,e.flo));
            if(rec==0){
                lev[e.v]=-1;
            }else{
                e.flo-=rec;
                rest-=rec;
                ed[e.v][e.rid].flo+=rec;
                if(rest==0) break;
            }
        }
        return tflo-rest;
    }
public:
    dinic(int S,int T):
        ed(new std::vector<ed_t>[Node_cnt+1]),
        _S(S),_T(T),_ans(0),
        lev(new size_t[Node_cnt+1]),
        cur(new size_t[Node_cnt+1]),
        _ncnt(0){}
    dinic(const dinic &o)=delete;
    dinic &operator=(const dinic &o)=delete;
    dinic(dinic &&o)=delete;
    ~dinic(){
        delete[] ed;
        delete[] lev;
        delete[] cur;
    }
    void add_edge(size_t u,size_t v,Flow_type flo){
        ed_t fo{true,v,(size_t)ed[v].size(),flo},ba{false,u,(size_t)ed[u].size(),0};
        ed[u].push_back(fo);
        ed[v].push_back(ba);
        if(_ncnt<u) _ncnt=u;
        if(_ncnt<v) _ncnt=v;
        return ;
    }
    Flow_type max_flow(){
        while(_bfs()){
            std::fill(cur,cur+_ncnt+1,0);
            _ans+=_dfs(_S,std::numeric_limits<Flow_type>::max());
        }
        return _ans;
    }
    std::vector<std::pair<size_t,size_t> > get_min_cut(){
        std::vector<std::pair<size_t,size_t> > ret;
        for(size_t i=1;i<=_ncnt;++i){
            for(auto &e:ed[i]){
                if(e.isori&&e.flo==0){
                    ret.push_back(std::make_pair(i,e.v));
                }
            }
        }
        return ret;
    }
};

} //namespace __detail

using __detail::dinic;

}//namespace _dinic

#endif // DINIC_HPP
#include<iostream>
using namespace std;
constexpr int MAXN=200,MAXM=500;
int N=0,M=0,S=0,T=0;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>N>>M>>S>>T;
    _dinic::dinic<MAXN> G(S,T);
    for(int i=1;i<=M;i++){
        int u,v,flo;
        cin>>u>>v>>flo;
        G.add_edge(u,v,flo);
    }
    cout<<G.max_flow()<<endl;
    return 0;
}

费用流库

使用 SPFA + EK 实现。

#include<iostream>
#include<vector>
#include<limits>
#include<deque>
template<int NSIZ,typename Flow_t,typename Cost_t,typename Comp=std::less<Cost_t> >
class min_cost_max_flow_t{
    static Cost_t min(const Cost_t &a,const Cost_t &b){return Comp()(b,a)?b:a;}
    static bool tomin(Cost_t &a,const Cost_t &b){if(Comp()(b,a)){a=b; return 1;} return 0;}
    struct ed_t{
        int v,r; Flow_t f; Cost_t c;
        bool operator>(const ed_t &o)const{
            return Comp()(o.c,c);
        }
    };
    int ncnt;
    std::vector<std::vector<ed_t> > ed;
    std::vector<char> vis;
    std::vector<Cost_t> dis;
    std::vector<Flow_t> Flow;
    std::vector<int> rev;
    std::deque<int> dque;
    std::vector<char> in;
    void upd(){
        if(dque.size()>=2){
            if(Comp()(dis[dque.back()],dis[dque.front()]))
                std::swap(dque.front(),dque.back());
        }
        return ;
    }
    void spfa(int S){
        std::fill(vis.begin(),vis.begin()+ncnt+1,0);
        std::fill(Flow.begin(),Flow.begin()+ncnt+1,0);
        std::fill(rev.begin(),rev.begin()+ncnt+1,-1);
        dis[S]=0; Flow[S]=std::numeric_limits<Flow_t>::max();
        vis[S]=1; dque.push_back(S); in[S]=1;
        while(!dque.empty()){
            int it=dque.front(); dque.pop_front(); in[it]=0;
            upd();
            for(auto e:ed[it])if(e.f>0){
                if((!vis[e.v])||Comp()(dis[it]+e.c,dis[e.v])){
                    dis[e.v]=dis[it]+e.c;
                    vis[e.v]=1;
                    Flow[e.v]=std::min(Flow[it],e.f);
                    rev[e.v]=e.r;
                    if(!in[e.v]){
                        dque.push_back(e.v); in[e.v]=1;
                        upd();
                    }
                }
            }
        }
        return ;
    }
public:
    min_cost_max_flow_t():ncnt(0),ed(NSIZ+1),vis(NSIZ+1),
        dis(NSIZ+1),Flow(NSIZ+1),rev(NSIZ+1),in(NSIZ+1){}
    void connect(int u,int v,Flow_t f,Cost_t c){
        if(ncnt<u) ncnt=u;
        if(ncnt<v) ncnt=v;
        int usiz=ed[u].size(),vsiz=ed[v].size();
        ed[u].push_back({v,vsiz,f,c});
        ed[v].push_back({u,usiz,0,-c});
        return ;
    }
    std::pair<Flow_t,Cost_t> maxflow(int S,int T){
        Flow_t flow=0; Cost_t cost=0;
        while(1){
            spfa(S);
            if(rev[T]==-1) break;
            Flow_t f=Flow[T];
            flow+=f;
            for(int it=T;rev[it]!=-1;){
                auto &re=ed[it][rev[it]];
                auto &e=ed[re.v][re.r];
                cost+=e.c*f;
                e.f-=f;
                re.f+=f;
                it=re.v;
            }
        }
        return {flow,cost};
    }
};
using ll=long long;
constexpr int MAXN=5e3,MAXM=5e4;
int main(){
    min_cost_max_flow_t<MAXN,ll,ll> G;
    using std::cin; using std::cout;
    int n,m,s,t; cin>>n>>m>>s>>t;
    for(int i=1;i<=m;i++){
        int u,v,w,c; cin>>u>>v>>w>>c;
        G.connect(u,v,w,c);
    }
    auto pi=G.maxflow(s,t);
    cout<<pi.first<<' '<<pi.second<<'\n';
    return 0;
}

标签:std,dque,int,ed,Flow,网络,流库,size
From: https://www.cnblogs.com/zhiyin123/p/18687161

相关文章

  • 网络流-最大流
    Dinic算法点击查看代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e4+10;intn,m,s,t,idx=1,head[N],cur[N],dis[N];//idx初始为1,从2.3开始配对structnode{ intu,v,w,nxt;}g[N];voidadd(intu,intv,intw){ g[++idx]={u,v,w......
  • 神经网络数学原理(3)正则项和超参数
    在上一节【神经网络数学原理(2)反向传播】中已经讲述如何通过反向传播来优化权重的过程和数学原理,本章主要讲述参数优化,优化参数是机器学习和深度学习中至关重要的过程,其目的是通过调整模型的权重、偏置和超参数来提升模型的准确性和泛化能力。优化的最终目标是使模型能够从训练数据......
  • 【云平台】云平台存储主要路线比较分析:存储虚拟化、分布式存储、网络共享文件存储
    #信创#金融领域#云平台【摘要】随着金融数字化转型的推进和深入,大家在选择云架构时开始考虑的更长远、更谨慎。一方面会从企业级、集团级和行业级整体发展演进的眼光进行整体规划,避免出现云或资源池的孤岛林立:另一方面采用自主可控的信创云架构也成为众多金融企业的重要抉择......
  • 基于卷积特征提取的自适应锚框优化:在RoBERTa与生成对抗网络的跨领域应用
    深度学习技术在图像处理和自然语言处理(NLP)领域展现了强大的能力。本文探讨了如何结合卷积神经网络(CNN)的特征提取能力、自适应锚框优化方法,以及RoBERTa和生成对抗网络(GAN)的跨领域应用,提供一种统一的优化策略,解决图像和文本相关的复杂问题。一、卷积特征提取的核心作用卷积神经......
  • 《OWASP TOP 10重磅来袭!网络安全的“定时炸弹”,你防范好了吗?》
    OWASPTOP10owasp官网:http://www.owasp.org.cn/一、引言简介Web应用安全的重要性在于保护网站和服务器免受外部攻击,确保数据安全和用户隐私。常见的Web应用安全漏洞包括注入攻击、身份验证漏洞、敏感数据暴露等。为了应对这些挑战,企业应采取多层次的安全防护措施,如使用W......
  • 【视频】R语言支持向量分类器SVM原理及房价数据预测应用及回归、LASSO、决策树、随机
    全文链接:  https://tecdat.cn/?p=38830原文出处:拓端数据部落公众号分析师:YuqiLiu在大数据时代,精准的数据分类与预测对各领域的发展至关重要。超平面作为高维空间中的关键概念,可将线性空间一分为二,为数据分类奠定了理论基石。基于此发展而来的最大边缘分类器,通过最大化边际距......
  • 【电力行业】2024中国网络安全产业势能榜优能企业「电力行业」典型案例展示
    电力行业作为国家的重要基础设施,涉及到大量的关键系统和设备。随着智能电网的普及,行业面临的安全挑战日益增加。如何通过创新技术加强电力系统的安全防护,确保持续稳定的服务,是行业发展的重要课题。通过一些典型案例,我们将展示信息安全技术在电力行业的成功实践。PS:典型案例展示排......
  • 想自学成黑客(白帽子),零基础小白如何自学黑客(网络安全)?
    前言:如何系统的自学黑客?最近很多小伙伴和粉丝都想自学成黑客(白帽子),那么零基础小白该从哪里开始学呢?在学习之前,要给自己定一个目标或者思考一下要达到一个什么样的水平,是学完找工作(进大厂)还是兴趣学习(成为一个业余的黑客)。黑客攻防是一个极具魅力的技术领域,但成为一名黑客......
  • 自学网络安全(黑客技术)2025年 —100天学习计划
    前言什么是网络安全网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。如何成为一名黑客很多朋友在学习安全方面都会半路转行,因为不知如何去学,在这里,我将这个整......
  • 听专家的,不如听国家的,网络安全究竟值不值得报?
    ......