首页 > 其他分享 >【模板】网络流最大流

【模板】网络流最大流

时间:2024-08-17 18:30:05浏览次数:6  
标签:src capacity 最大 val int 网络 sink dist 模板

最大流

题目要求:给出n点 m边 src sink 然后每条边有 u v capacity 求最大流

题目链接P3376 【模板】网络最大流

EK(Edmonds–Karp)算法:

\[\begin{align} & \color{Red}时间复杂度O(nm^2) \\ & \color{Red}空间复杂度O(n+m) \\ \end{align} \]

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define int long long 
const int N = 6e5 + 9;  
const int inf2 = 0x7f7f7f7f; 

using namespace std;
#define int long long
#define ios std::ios::sync_with_stdio(false); std::cin.tie(0); 

int n, m, src, sink; 
int ans = 0;          // 最大流量
int head[N];          
int pre[N];           // 存储前驱边的数组 即连接节点u的上一条egde
struct node {
    int to, capacity, next;  
} e[N];
bool vis[N];         
int idx = 1;         
int dist[N];         // 存储从源节点到各节点的最短路径流量
int flag[2510][2510]; // 用于标记边的索引

void add(int u, int v, int val) {
    // 添加正向边
    e[++idx] = {v, val, head[u]};
    head[u] = idx;
    // 添加反向边
    e[++idx] = {u, 0, head[v]};
    head[v] = idx;
}

bool bfs() {
    memset(vis, 0, sizeof vis); // 清空访问标记数组
    dist[src] = inf2; // 初始化源节点的距离为无穷大
    queue<int> q;
    q.push(src);
    vis[src] = 1;

    while (!q.empty()) {
        int u = q.front();
        q.pop();
        for (int i = head[u]; i != 0; i = e[i].next) {
            int v = e[i].to;
            int val = e[i].capacity;
            // 如果边的容量为 0 或节点 v 已访问,跳过
            if (e[i].capacity == 0 || vis[v]) continue;
            vis[v] = 1;
            pre[v] = i; // 记录前驱边
            dist[v] = min(dist[u], val); // 流量只能取得最小的
            q.push(v); 
            if (v == sink) // 到达sink,返回 true
                return true;
        }
    }
    return false; // 没有找到增广路径
}

void EK() {
    int u = sink;
    while (u != src) {
        int mmin_stream = dist[sink]; // 当前增广路径的流量是整条路的最小值
        int last = pre[u]; 
        // 更新正向边的容量和反向边的容量
        e[last].capacity -= mmin_stream;
        e[last ^ 1].capacity += mmin_stream;
        u = e[last ^ 1].to; // 更新 u 为反向边的终点
    }
    ans += dist[sink]; // 增加当前流量到总流量
}

void bd() {
    cin >> n >> m >> src >> sink;
    for (int i = 1; i <= m; ++i) {
        int u, v, val;
        cin >> u >> v >> val; 
        if (flag[u][v] == 0) {
            add(u, v, val); // 添加边到图中
            flag[u][v] = idx - 1; // 记录边的索引 因为dix起步时=1
        } 
        else 
            e[flag[u][v]].capacity += val; 
            //存在多条边 容量加起来
    }
}

signed main() {
    ios;
    bd(); 
    while (bfs()) {
        EK();
    }
    cout << ans; // 输出最大流量a
    return 0;
}

标签:src,capacity,最大,val,int,网络,sink,dist,模板
From: https://www.cnblogs.com/Phrink734/p/18364773

相关文章

  • 网络监控管理系统是什么?一站式网络监控,360°无死角管理,让运维工作事半功倍!
    在信息化高速发展的今天,企业的网络环境日益复杂,数据安全与运维效率成为了企业管理中的重中之重。为了应对这一挑战,安企神网络监控管理系统应运而生,它以一站式、360°无死角的管理策略,为企业的网络运维工作带来了革命性的变革,让运维工作事半功倍。一、什么是网络监控管理系统?......
  • 用pytorch实现LeNet-5网络
     上篇讲述了LeNet-5网络的理论,本篇就试着搭建LeNet-5网络。但是搭建完成的网络还存在着问题,主要是训练的准确率太低,还有待进一步探究问题所在。是超参数的调节有问题?还是网络的结构有问题?还是哪里搞错了什么1.库的导入dataset:datasets.MNIST()函数,该函数作用是导入MNIST数......
  • GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代
        ......
  • 图数据库在社交网络分析中的应用:深度剖析与探索
    图数据库在社交网络分析中的应用:深度剖析与探索在数字时代,社交网络已成为人们日常生活不可或缺的一部分,它不仅连接了人与人之间的关系,还承载了海量的信息和交互数据。随着社交网络规模和复杂度的不断增长,如何高效地存储、查询和分析这些数据成为了一个重大挑战。图数据库以......
  • GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代
       ......
  • C++ 模版详解 | 函数模板 | 类模版
    前言 什么是模板?模板是一个泛型编程的概念,即不考虑类型的一种编程方式,能够实现代码重用,提高效率模板可分为函数模板、类模板 模板的声明和定义模板的声明有两种,一种就是typename,另外一种就是使用class ,一般使用一种声明格式就可以了,不建议混合使用。template<typenam......
  • PADS router 电气网络长度监视器使用
    1、右键空白处,选择网络2、左键选择目标网络,再右键选择电气网络3、右键选择创建匹配长度的网络组4、在导航栏中点出电子表格(图中标红选项)5、在电子表格的上方导航栏里选择 与选择同步6、在选择网络的状态下选择目标网络7、右键选择电气网络,这样便可在电子表格中查看网......
  • Ping一个网络的过程
    Ping命令主要用来检测一个网络的可达性和延迟Ping的过程主要基于ICMP(互联网控制消息协议)实现,其基本过程包括:①当执行Ping命令,如pingjavabetter.cn,Ping首先解析域名获取IP地址,然后向目标IP发送一个ICMPEchoRequest消息。②当目标IP收到ICMPEchoRequest消......
  • 【生日视频制作】飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】
    飞机机身生日视频制作教程AE模板改文字特效广软件告生成器素材【生日视频制作】飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】生日视频制作步骤:安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频......
  • 【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例
    这两天在做那个CodeMonky的胡闹厨房的案例,一直困扰我的是关于Lobby和Relay的相关网络服务,需要挂加速器并且延迟不低,所以我一直在寻找一些其他替代方案,想起来之前做一个UEC++的网络枪战时做过一个内网穿透的方法,所以在Unity中也采用这个方案,但中间怎么改IP和端口都没法连接成......