网络流-EK算法(保姆级教学)

news2024/11/15 16:17:25

本文引用董晓算法的部分图片。

一些不能带入纸质资料的竞赛,网络流纳入考纲。

因为需要默写,想来也不会考默写dinic这种算法难倒大家,只需要快速敲对EK算法就行了。

EK算法能在O(n*m^2)的复杂度内解决最大流问题,其中最大流就是源点到汇点的最大流量。

一般来说起点的流量是无穷,每条边有一个最大流容量c,再定义当前边已经流过了容量f。

很显然,网络流模型必须满足每条边的f<=c,同时每条边的流入量必须等于流出量。

EK算法的过程如下:

不断尝试,从源点找一条到达汇点流量大于0的路径,我们又称这条路为增广路

如图就是一条增广路。(图中5/5表示f/c)

但是确定一条增广路后,我们找新的增广路,就会因为旧的路径已经存在而被阻挡。

这时候我们就需要建立反向边。

反向边的意义在于给了之前存在的路径一个反悔的机会。

如图所示,假设右下角是汇点,左图是一条黑色的增广路,中间图片中,新增了一条红色的增广路,因为建立了反向边,所以红色路径可以正常到达汇点。等效成右图所示的结果,这样最大流就从5变成10了,其实就是通过反向边来达到旧边给新边让路的效果。

代码如下所示:

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e3+5;
int a[N][N];
int mf[N],isque[N];
//mf表示到该点的流量 
int pre[N];
int n,m,e;
int bfs(int su,int sv){
	memset(mf,0,sizeof(mf));
	for (int i=0;i<=n+m+1;i++) mf[i]=0;
	for (int i=0;i<=n+m+1;i++) isque[i]=0;
	mf[su]=INF;
	queue<int> q;
	q.push(su);
	isque[su]=true;
	pre[su]=-1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		isque[u]=false;
		for (int v=0;v<=n+m+1;v++){
			if (u==v) continue;
			if (mf[v]<min(mf[u],a[u][v])){
				mf[v]=min(mf[u],a[u][v]);
				pre[v]=u;
				if (mf[sv]!=0)	return true;
				if (isque[v]==false){
					q.push(v);
					isque[v]=true;
				}
			}
		}
	}
	return false;
}
int ek(int su,int sv){
	int ans=0;
	while(bfs(su,sv)){
		ans+=mf[sv];
		int p=sv;
		while(pre[p]!=-1){
			a[p][pre[p]]+=mf[sv];
			a[pre[p]][p]-=mf[sv];
			p=pre[p];
		}
	}
	return ans;
}
void work(){
	cin>>n>>m>>e;
	for (int i=1;i<=n;i++){
		a[0][i]=1;
		a[i][0]=0;
	}
	for (int i=1;i<=m;i++){
		a[i+n][n+m+1]=1;
		a[n+m+1][i+n]=0;
	}
	for (int i=1;i<=e;i++){
		int u,v;cin>>u>>v;
		a[u][v+n]=1;
		a[v+n][u]=0;
	}
	cout<<ek(0,n+m+1)<<"\n";
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	work();
	return 0;
} 

其中用到了一个BFS和一个DFS(ek)。

BFS在不断找增广路(从源点找一条到达汇点流量大于0的路径),DFS把找到的增广路的流量确定下来,表示到边上,减少对应的容量,并给反向边增加相同的容量(能过去多少就能反悔多少)。

图的存储用邻接矩阵表示(反正都用EK算法了qwq,就更简单一点吧)。

BFS不断找增广路,其中套了一个SPFA的队列优化。mf数组表示到该点的流量为多少,因为需要不断找增广路,并把增广路得到的路径确定到边权的f(已经流过了容量),所以每次确定完成后mf数组就不再需要了,所以每次开始BFS之前要重新置为0。

其中有这个代码:

if (mf[v]<min(mf[u],a[u][v])){
    mf[v]=min(mf[u],a[u][v]);
}

mf[u]表示前面的点u最多给后面的点v多少流量,a[u][v]邻接矩阵表示这个管子最多承受多少流量,两者的较小值才是v点能过去的最大流量(此处贪心的想,因为要求最大流,所以肯定v点流量越大越好)

这里可能会有一个比较疑惑的点,那既然u到达了v,mf[v]更新了流量,为了满足每条边的流入量必须等于流出量,u点的mf数组不是应该更新吗?为什么代码里没有更新。如果不更新的话,假如mf[u]=5,岂不是u的每一个mf[v]都会被设置成5?

这是因为BFS的意义是找到一条可行的增广路,而不是真的全部遍历完才把结果抛给DFS。这样一旦有一条路径到达汇点,就一定仅仅只会有一条路径(感觉说了句废话),不会出现重复的情况。

这里可以发现mf的意义不是当前点的实际最大流,而是为了找到一条尽可能大且可行的流服务的。

感谢观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1869742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音外卖服务商有哪些,盘点这几家正规服务商!

当前&#xff0c;抖音外卖的关注度不断上涨&#xff0c;抖音外卖服务商也逐渐成为了众多创业者心中的理想创业赛道。在此背景下&#xff0c;抖音外卖服务商的入局途径多次引发创业者热议&#xff0c;以抖音外卖服务商有哪些公司为代表的相关话题更是长期位居创业者问题榜单的前…

WordPress Dokan Pro插件 SQL注入漏洞复现(CVE-2024-3922)

0x01 产品简介 WordPress Dokan Pro插件是一款功能强大的多供应商电子商务市场解决方案,功能全面、易于使用的多供应商电子商务平台解决方案,适合各种规模的电商项目。允许管理员创建一个多卖家平台,卖家可以注册账户并在平台上创建自己的店铺,展示和销售自己的产品。提供…

SecureCRT使用SSH登录服务器报错:Key exchange failed

SecureCRT使用SSH登录Ubuntu服务器报错&#xff1a;Key exchange failed 原因&#xff1a; ssh客户端与服务器的公钥协商失败&#xff0c;SecureCRT客户端所指定的秘钥交换算法&#xff08;KexAlgorithms &#xff09;&#xff0c;不在服务端支持范围内。可能是服务端的sshd版…

【代码随想录】【算法训练营】【第51天】 [115]不同的子序列 [583]两个字符串的删除操作 [72]编辑距离

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 51&#xff0c;周四&#xff0c;又是不能坚持的一天~ 题目详情 [115] 不同的子序列 题目描述 115 不同的子序列 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 …

微信公众平台扫码登录:Spring Boot与JustAuth的完美结合

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 微信公众平台扫码登录&#xff1a;Spring Boot与JustAuth的完美结合 前言前提什么是JustAuthJust…

kali下安装使用蚁剑(AntSword)

目录 0x00 介绍0x01 安装0x02 使用1. 设置代理2. 请求头配置3. 编码器 0x00 介绍 蚁剑&#xff08;AntSword&#xff09;是一个webshell管理工具。 官方文档&#xff1a;https://www.yuque.com/antswordproject/antsword 0x01 安装 在kali中安装蚁剑&#xff0c;分为两部分&am…

python获取快手账号列表数据

快手数据获取相对简单访问地址固定且不需要登录token 列表地址获取的固定接口 https://www.kuaishou.com/graphql 发送post请求注意每个快手账号对应的id import time from datetime import datetime import logging import json import pymysql import requests# 创建一个lo…

vue3 【提效】自动导入框架方法 unplugin-auto-import 实用教程

是否还在为每次都需要导入框架方法而烦恼呢&#xff1f; // 每次都需手动导入框架方法 import { ref } from vuelet num ref(0)用 unplugin-auto-import 来帮你吧&#xff0c;以后只需这样写就行啦&#xff01; let num ref(0)官方示例如下图 使用流程 1. 安装 unplugin-au…

文物管理技术RFID技术

随着科技的不断发展&#xff0c;科技在各个领域都发挥着重要的作用。其中&#xff0c;在文物管理方面&#xff0c;RFID技术的应用正在逐渐引起人们的关注。RFID&#xff08;Radio Frequency Identification&#xff09;技术是一种通过无线电信号进行非接触式识别的技术&#xf…

【深度学习】Error: TensorBoard could not bind to port 6006 问题解决

问题描述 在启动TensorBoard时&#xff0c;遇到了端口冲突&#xff0c;如下图所示&#xff1a; 根据提示&#xff0c;出错原因是因为端口已经被占用了&#xff0c;因此我们要结束占用这个端口的进程。 我的系统是Windows系统&#xff0c;并不是Linux&#xff0c;网上大部分方…

基于springboot时装购物系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 管理员&#xff1a;首页、个人中心、用户管理、商品分类管理、颜色管理、商品信息管理、商品评价…

以数治税时代来临,企业如何应对?

全电发票是数字经济时代发票的新形态&#xff0c;顺应了数字经济潮流。现如今&#xff0c;国家正全力推动行业数字化进程&#xff0c;预计&#xff0c;2025年将基本实现发票全领域、全环节、全要素电子化&#xff0c;实现税务执法、服务、监管与大数据智能化应用深度融合、高效…

数据库使用笔记

1.mysql数据库频繁访问导致连接超时 解决办法一&#xff1a; 优化查询&#xff1a;检查并优化SQL查询语句&#xff0c;减少不必要的数据库调用。增加连接池大小&#xff1a;如果应用程序使用连接池&#xff0c;可以考虑增加连接池的最大连接数。&#xff08;注&#xff1a;不能…

Profibus协议转Modbus协议网关模块在船舶中的应用

一、背景 在当今数字化快速发展的时代&#xff0c;船舶作为重要的交通工具之一&#xff0c;也在不断追赶着科技的步伐&#xff0c;实现自身的智能化升级。而在这个过程中&#xff0c;Profibus转Modbus网关&#xff08;XD-MDPB100&#xff09;作为关键的一环&#xff0c;扮演着…

主流先进封装技术介绍

主流先进封装技术介绍 先进封装是指封装集成电路 (IC) 以提高性能的多种创新技术。 本质上&#xff0c;就是将传统封装中被延缓的数据传输速度和被损耗的大量功耗&#xff0c;通过技术和结构的创新极大程度的找回。 1. FO 封装 FO封装包括三大类&#xff1a; 核心扇出型&a…

基于SpringBoot的藏区特产销售平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot框架 工具&#xff1a; MyEclipse 系统展示 首页 个人中心 特产信息管理 订单管…

CSS基础学习记录(6)

目录 1、从最基本的页面开始 2、添加图像/浮层部分 3、位置调整 4、添加动效 4.1、添加浮层动效 4.2、添加背景动画 根据前面css的学习&#xff0c;本篇来实践下前面学习的知识&#xff0c;主要实现如下这样的效果。 下面我们一步步实现上面的效果。 1、从最基本的页面开…

爬取必应关键字搜索结果url

上代码 import aiohttp import asyncio from lxml import etree import aiofiles import time import random aiohttp 和 asyncio 用于异步HTTP请求和事件循环。 lxml 用于解析HTML。 aiofiles 用于异步文件操作。 time 和 random 用于控制爬取速度。 headers {User-Agent: M…

智慧校园-缴费管理系统总体概述

在构建现代化教育环境的过程中&#xff0c;智慧校园缴费管理系统脱颖而出&#xff0c;成为提升校园财务管理效率与服务质量的关键一环。缴费管理系统需要精心设计&#xff0c;通过科技力量&#xff0c;让原本繁琐的缴费流程变得简单快捷&#xff0c;同时增强家校之间的互动与信…

gbase 8c分布式升级步骤

GBase 8c 多模多态企业级分布式数据库具备高性能、高可用、弹性伸缩、高安全性等特性&#xff0c;可以部署在物理机、虚拟机、容器、私有云和公有云&#xff0c;为关键行业核心系统、互联网业务系统和政企业务系统提供安全、稳定、可靠的数据存储和管理服务。GBase 8c支持行存、…