首页 > 其他分享 >网络流最大流

网络流最大流

时间:2024-10-30 19:42:11浏览次数:6  
标签:head 最大 val int 网络 tot maxn dis

EK

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long

const int maxn = 5000 + 10, inf=0x3f3f3f3f3f3f3f3f;

int tot=1,head[maxn],n,m,s,t,dis[maxn*4],pre[maxn*4],ans=0,flg[maxn][maxn];
bool vis[maxn*4];
struct node{
    int nxt,to,val;
}e[maxn*4];

void add_edge(int u,int v,int w){
    e[++tot].to=v;e[tot].nxt=head[u];head[u]=tot;e[tot].val=w;
    e[++tot].to=u;e[tot].nxt=head[v];head[v]=tot;e[tot].val=0;
}

inline int bfs(){
    for(int i=1;i<=n;i++)vis[i]=0;
    queue<int>q;
    q.push(s);
    vis[s]=1;dis[s]=inf;
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=head[x];i;i=e[i].nxt){
            if(e[i].val==0)continue;//rem>0
            int v=e[i].to;
            if(vis[v])continue;//unvisited edge
            dis[v]=min(dis[x],e[i].val);//get min capacity
            pre[v]=i;//the edge before i
            q.push(v);
            vis[v]=1;
            if(v==t)return 1;//find one extension road
        }
    }
    return 0;
}
inline void update(){
    int x=t;
    while(x!=s){
        int v=pre[x];
        e[v].val-=dis[t];
        e[v^1].val+=dis[t];
        x=e[v^1].to;
    }
    ans+=dis[t];
}

signed main(){
    ios::sync_with_stdio(false);cin.tie(nullptr); 

    cin>>n>>m>>s>>t;
    for(int i=1;i<=m;i++){
        int u,v,w;cin>>u>>v>>w;
        if(flg[u][v])e[flg[u][v]-1].val+=w;
        else add_edge(u,v,w),flg[u][v]=tot;
    }
    while(bfs()!=0){
        update();
    }
    cout<<ans<<endl;
    return 0;
    
}

Dinic

标签:head,最大,val,int,网络,tot,maxn,dis
From: https://www.cnblogs.com/lyrrr/p/18516480

相关文章

  • 基于Java+SpringBoot+Vue+HTML5在线互动学习网站(源码+LW+调试文档+讲解等)/在线学习/
    博主介绍......
  • 基于Java+SpringBoot+Vue+HTML5图书电子商务网站(源码+LW+调试文档+讲解等)/在线图书
    博主介绍......
  • 20222412 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    202224122024-2025-1《网络与系统攻防技术》实验三实验报告1.实验内容(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件veil,加壳工具使用C+shellcode编程(2)通过组合应用各种技术实现恶......
  • 给定一个二叉树,找出其最大深度
      文心快码(BaiduComate)是基于百度文心大模型,在研发全流程全场景下为开发者提供辅助建议的智能代码助手。结合百度积累多年的编程现场大数据、外部优秀开源数据,可为开发者生成更符合实际研发场景的优秀代码,提升编码效率,释放“十倍”软件生产力。......
  • 基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) BO优化前 BO优化过程 BO优化后  2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)MBsize=32;Lr=0.1;%CNNLSTM构建卷积神经网络laye......
  • 【图神经网络】 AM-GCN论文精讲(全网最细致篇)
    AM-GCN网络系列论文精讲部分0.摘要1.引言2.融合能力的GCNs:一项实验研究2.1案例1:随机拓扑结构和相关节点特征2.2案例2:相关拓扑结构和随机节点特征3.AM-GCN:提出的模型3.1特定卷积模块3.2共享卷积模块3.3注意力机制3.4目标函数3.4.1一致性约束3.4.2差异性约......
  • C++算法练习-day26——239.滑动窗口的最大值
    题目来源:.-力扣(LeetCode)题目思路分析题目:给定一个整数数组 nums 和一个整数 k,请找出该数组中所有长度为 k 的子数组中的最大元素,并返回这些最大元素组成的数组。思路:滑动窗口:这是一个典型的滑动窗口问题,其中窗口的大小为 k。我们需要遍历整个数组,同时保持一......
  • 239. 滑动窗口最大值(难)
    目录题目法一、暴力枚举法二、双端队列题目给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。法一、暴力枚举遍历数组,获取每个窗口的子数......
  • 网安人必备!开源网络安全工具TOP 10(附下载地址)
    前言工欲善其事,必先利其器。对于广大的网络安全从业者,以及未来想要从事网络安全的人来说,选择并善用合适的网络安全工具,能有效提升工作效率。开源网络安全工具之所以能够在众多安全解决方案中脱颖而出,不仅是因为它们具备强大的功能和高效的性能,更因为它们的开放性和可扩展......
  • 网络安全溯源(非常详细),零基础入门到精通,看这一篇就够了
    前言在网络安全护网中,溯源是什么?在网络安全护网中,溯源是指通过收集、分析和解释数字证据来追踪和还原网络攻击或其他网络犯罪活动的过程。它旨在确定攻击者的身份、行为和意图,以便采取适当的对策,并为法律机构提供必要的证据。溯源可以应用于多种场景,例如网络入侵调查、恶......