求图的最大流-EdmondsKarp方法

求解最大流的四种算法介绍、利用最大流模型解题入门 上一篇中介绍了网络流的基础,最大流最小割定理的证明,下面来看如何求一个容量网络的最大流,这里介绍四种算法:EK算法、SAP算法、DINIC算法、HLPP算法。这四种算法中,前三种基于增广路,最后一种基于预流推进。 基于增广路的算法 Ford-Fulkerson算法 先来简单提一下Ford-Fulkerson算法。 在上一节中证明了,如果一个可行流中没有增广路,那么此时这个可行流的流量就是最大流,因... 阅读详情

发布一个k8s部署视频:https://edu.youkuaiyun.com/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.youkuaiyun.com/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.youkuaiyun.com/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件
————————————————------------------------------------------------------------------------------------------------------------------

 

package com.data.struct;



public class EdmondsKarp {
	private Node[][]graphic;
	private Node s;
	private Node t;
	private NodeArrayQueue2 queue;
	
	public EdmondsKarp(){
		graphic=new Node[6][6];
		Node node0=new Node();
		node0.start=0;
		node0.end=0;
		graphic[0][0]=node0;
		Node node1=new Node();
		node1.start=1;
		node1.end=1;
		graphic[1][1]=node1;
		Node node2=new Node();
		node2.start=2;
		node2.end=2;
		graphic[2][2]=node2;
		Node node3=new Node();
		node3.start=3;
		node3.end=3;
		graphic[3][3]=node3;
		Node node4=new Node();
		node4.start=4;
		node4.end=4;
		graphic[4][4]=node4;
		Node node5=new Node();
		node5.start=5;
		node5.end=5;
		graphic[5][5]=node5;
		Node node01=new Node();
		node01.c=16;
		node01.start=0;
		node01.end=1;
		graphic[0][1]=node01;
		Node node10=new Node();
		node10.start=1;
		node10.end=0;
		node10.reverse=true;
		graphic[1][0]=node10;
		Node node02=new Node();
		node02.c=13;
		node02.start=0;
		node02.end=2;
		graphic[0][2]=node02;
		Node node20=new Node();
		node20.start=2;
		node20.end=0;
		node20.reverse=true;
		graphic[2][0]=node20;
		Node node13=new Node();
		node13.c=12;
		node13.start=1;
		node13.end=3;
		graphic[1][3]=node13;
		Node node31=new Node();
		node31.start=3;
		node31.end=1;
		node31.reverse=true;
		graphic[3][1]=node31;
		Node node21=new Node();
		node21.c=4;
		node21.start=2;
		node21.end=1;
		graphic[2][1]=node21;
		Node node12=new Node();
		node12.start=1;
		node12.end=2;
		node12.reverse=true;
		graphic[1][2]=node12;
		Node node24=new Node();
		node24.start=2;
		node24.end=4;
		node24.c=14;
		graphic[2][4]=node24;
		Node node42=new Node();
		node42.start=4;
		node42.end=2;
		node42.reverse=true;
		graphic[4][2]=node42;
		Node node32=new Node();
		node32.c=9;
		node32.start=3;
		node32.end=2;
		graphic[3][2]=node32;
		Node node23=new Node();
		node23.start=2;
		node23.end=3;
		node23.reverse=true;
		graphic[2][3]=node23;
		Node node35=new Node();
		node35.c=20;
		node35.start=3;
		node35.end=5;
		graphic[3][5]=node35;
		Node node53=new Node();
		node53.start=5;
		node53.end=3;
		node53.reverse=true;
		graphic[5][3]=node53;
		Node node43=new Node();
		node43.c=7;
		node43.start=4;
		node43.end=3;
		graphic[4][3]=node43;
		Node node34=new Node();
		node34.start=3;
		node34.end=4;
		node34.reverse=true;
		graphic[3][4]=node34;
		Node node45=new Node();
		node45.c=4;
		node45.start=4;
		node45.end=5;
		graphic[4][5]=node45;
		Node node54=new Node();
		node54.start=5;
		node54.end=4;
		node54.reverse=true;
		graphic[5][4]=node54;
		
		s=graphic[0][0];
		t=graphic[5][5];
		queue = new NodeArrayQueue2((6 * (6 - 1) / 2) + 5);
		
	}
	
	public void edmondsKarp()throws Exception{
		broadFirstSearch();
		while(t.parent!=null){
			Node p=t;
			Node end=t;
			Node start=t.parent;
			int maxF=Integer.MAX_VALUE;
			while(p.parent!=null){
				Node edge=graphic[start.start][end.start];
				if(!edge.reverse){
					maxF=Math.min(maxF, edge.c-edge.f);
				}else{
					maxF=Math.min(maxF, edge.c-edge.fr);
				}
				p=end.parent;
				end=p;
				start=p.parent;
				
			}
			 p=t;
			 end=t;
			 start=t.parent;
			 while(p.parent!=null){
				 Node edge=graphic[start.start][end.start];
				 if(!edge.reverse){
					 edge.f=edge.f+maxF;
				 }else{
					 edge.fr=edge.fr+maxF;
				 }
				 p=end.parent;
				 end=p;
				 start=p.parent;
			 } 
			 t.parent=null;
			 broadFirstSearch();
		}
	}
	
	public void broadFirstSearch() throws Exception {
		for(int i=0;i<graphic.length;i++){
			for(int j=0;j<graphic.length;j++){
				if(graphic[i][j]!=null){
					graphic[i][j].color=Node.WHITE;
					graphic[i][j].parent=null;
				}
			}
		}
		s.color = Node.GRAY;
		s.d = 0;
		queue.enqueue(s);
		while (!queue.isEmpty()) {
			Node u = queue.dequeue();
			Node prev = u;
			for(int i=0;i<graphic.length;i++){
				Node v = graphic[u.start][i];
				if (v != null) {
					if (graphic[v.end][v.end].color == Node.WHITE) {
						if(v.c-v.f!=0&&!v.reverse){
							queue.enqueue(graphic[v.end][v.end]);
							graphic[v.end][v.end].parent = prev;
							graphic[v.end][v.end].color = Node.GRAY;
							graphic[v.end][v.end].d = prev.d + 1;
						}
						if(v.reverse&&v.fr-v.c<0){
							queue.enqueue(graphic[v.end][v.end]);
							graphic[v.end][v.end].parent = prev;
							graphic[v.end][v.end].color = Node.GRAY;
							graphic[v.end][v.end].d = prev.d + 1;
						}
					}
				}
			}
			u.color = Node.BLACK;
		}
	}
	public void printResult(){
		int result=0;
		for(int i=0;i<graphic.length;i++){
			if(graphic[t.start][i]!=null){
				result+=graphic[i][t.start].f;
			}
		}
		System.out.println("max flow:"+result);
	}
	
	public void print(){
		for(int i=0;i<graphic.length;i++){
			for(int j=0;j<graphic.length;j++){
				if(graphic[i][j]!=null){
					System.out.print(graphic[i][j].c+" ");
				}else{
					System.out.print("  ");
				}
			}
			System.out.println();
		}
	}
	private class Node{
		public static final int WHITE = 1;
		public static final int BLACK = 2;
		public static final int GRAY = 3;
		private int color = WHITE;
		private int c;
		private int f;
		private int fr;
		private int start;
		private int end;
		private int d=Integer.MAX_VALUE;;
		private Node parent;
		private boolean reverse;
	}
	class NodeArrayQueue2 {
		private Node[] data;
		private int head;
		private int tail;
		private boolean full;

		public NodeArrayQueue2(int size) {
			data = new Node[size];
			head = 0;
			tail = 0;
		}

		public void enqueue(Node d) throws Exception {
			if (head - tail == 0 && full || (head == 0 && (tail == 0) && full)) {
				throw new Exception("full");
			}
			data[tail] = d;
			tail = tail + 1;
			if (tail == data.length) {
				tail = 0;
			}
			if (head == tail) {
				full = true;
			}

		}

		public Node dequeue() throws Exception {
			if (head == tail && !full || (head == data.length && tail == 0)) {
				throw new Exception("empty");
			}
			full = false;
			head = head + 1;
			if (head == data.length) {
				head = 0;
				return data[data.length - 1];
			} else {
				return data[head - 1];
			}

		}

		public boolean isEmpty() {
			if (head == tail && !full || (head == data.length && tail == 0)) {
				return true;
			} else {
				return false;
			}
		}

	}
	public static void main(String[] args)throws Exception {
		EdmondsKarp e=new EdmondsKarp();
		e.print();
		e.edmondsKarp();
		e.printResult();

	}

}


 

网络流入门之最大流问题(1) changxv大佬说网络流非常万能,几乎可以解决所有与图有关的题目(网络流的强悍!),这里写出博客只是谈谈我自己的心得体会,帮助那些看到网络流望而却步的同学们以及我自己有个大致了解。 概念: 在一张带权图G中,我们已知源点s与汇点t,假设我们要将水从s输送到t,其间必然会通过一些边以及其它中转点(边就像是水管,边权就是这个水管的最大容量即最大运送的水量),最大流问题就是要我们求在每个水管最大容... 阅读详情

相关推荐

最大网络流Edmonds-Karp算法

用于计算最大网络流的经典的Edmonds-Karp算法,代码自带例子,边权支持double类型。

网络流之最大流问题(Edmonds_Karp 算法)

之前学完最大流问题后没及时整理,最近学离散数学涉及到这方面的知识,就回过头来复习一下,顺便整理下来。 什首先,什么是最大流问题? 假设要把一些物品从结点S运送到结点T,可以借助其他结点进行中转,各结点之间的边的权值表示该边一次最多可以运输多少件物品,求最多可以一次性从结点S运输多少件物品到T。这就是最大流问题。 其中结点S称为源点(只流出不流入),结点T称为汇点(只流入不流出); 每条边的...

平凡 4464

【SAM2系列】windows单GPU复现时的bug解决记录

windows运行sam2,就感觉在开一艘破破烂烂的船,每走一步报一个错,bug源源不断的冒出来😭😭😭😭😭。

weixin_43571113的博客 1317

C语言经典算法之Edmonds-Karp算法

Edmonds-Karp算法是求解网络流问题中的最大流的一种算法,它是Ford-Fulkerson方法的一个改进版本,通过使用BFS(广度优先搜索)而不是DFS(深度优先搜索)来寻找增广路径,以期更快地找到较短的增广路径,从而提高算法效率。

weixin_56154577的博客 1886

对比实验系列:Efficientdet环境配置及训练个人数据集

可以通过下方链接下载Efficientdet源码。

Yayisheng的博客 4586

Gromacs文件格式全解析:xtc vs trr vs cpt,哪种更适合你的模拟需求?

本文深入解析Gromacs分子动力学模拟中的三种核心文件格式xtc、trr和cpt,详细对比其技术特性和适用场景。xtc适合存储效率优先的场景,trr保留完整动力学数据,cpt确保模拟精确重启。通过实际配置示例和存储优化技巧,帮助用户根据模拟需求选择最佳格式组合,平衡分析灵活性与存储成本。

weixin_29281941的博客 97

网络流之最大流算法(EdmondsKarp)

求网络流有很多算法,这几天学习了两种,记录一下EK算法。 首先是网络流中的一些定义: V表示整个图中的所有结点的集合. E表示整个图中所有边的集合. G = (V,E) ,表示整个图. s表示网络的源点,t表示网络的汇点. 对于每条边(u,v),有一个容量c(u,v)   (c(u,v)>=0),如果c(u,v)=0,则表示(u,v)不存在在网络中。相反,如果原网络中不存在边(u,v)

大神养成中..... 9万+

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 242

图算法之最大流算法(Maximum Flow)Ford-Fulkerson 算法Edmonds-Karp 算法详细解读

Ford-Fulkerson 算法是最大流问题的基础方法,适合理解增广路径和流量更新的过程,但其复杂度依赖于增广路径的查找方法。 Edmonds-Karp 算法利用 BFS 查找增广路径,确保了时间复杂度的多项式限制,适合大多数实际应用。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 2730

STM32F103 -- LIN从机通讯 -- 程序代码 -- 详细讲解版(2万字长文)

主要代码分为3个文件,usart文件是对GPIO端口和串口Lin模式的初始化,lin_buffer文件是对串口环形缓冲区的编写,lin_driver文件是Lin从机模式驱动代码。通过这三个文件的代码便可实现STM32F103的LIN从机通讯。

晴朗luo的博客 1万+

Dify 第 19 篇 手把手教你开发 Dify 插件:从零实现一个时间工具

本文介绍了Dify平台的插件开发机制和流程。Dify支持多种插件类型,包括模型、工具、数据源等,可通过CLI工具快速开发插件。文章详细讲解了如何安装Dify CLI工具,并演示了从零开发一个获取系统时间插件的完整过程,包括项目初始化、文件解读和打包部署。通过该教程,开发者可以快速掌握Dify插件开发的核心要点,实现自定义功能扩展。

甘蓝的专栏 2451

Ford-Fulkerson算法——最大流、最小割问题

流网络 网络流G=(v,E)是一个有向图,其中每条边(u,v)均有一个非负的容量值,记为c(u,v)≧0。如果(u,v)∉E则可以规定c(u,v)=0。网络流中有两个特殊的顶点,即源点s和汇点t。 流的定义 与网络流相关的一个概念是流。设G是一个流网络,其容量为c。设s为网络的源点(source),t为汇点(sink),那么G的流是一个函数f:V×V→.........

Effy's coding way 1万+

FOC高频注入量产级C语言实现方案

高频注入技术是无传感器FOC实现零速和低速控制的关键方法,解决了传统反电动势观测器在低速失效的问题。该技术通过向电机注入高频电压信号,利用永磁同步电机凸极性特性,从高频电流响应中解调出转子位置信息。文章详细介绍了三种主流高频注入方法(旋转电压注入、脉振电压注入和脉振电流注入)的原理及实现流程,重点分析了脉振电压注入的信号处理步骤和位置观测器设计。同时提供了完整的C语言实现代码,包括硬件抽象层、核心算法模块(坐标变换、电流环、SVPWM等)和系统集成方案,并给出量产优化建议和安全保护机制。这套方案适用于要求高

汽车软件开发 794

网络流解析——最大流EdmondsKarp算法

原理并不复杂,但存在的疑惑主要集中在反向边的引入,以下篇幅作以讲解。 首先假设一不存在TS边的单源有向加权图。 (所谓“TS边”即是指对于任一割,方向为T->S的边) 类似下图(1为S,6为T,边权(容量)均为10) 此时若求解最大流问题(具体命题省略),按照EdmondsKarp算法,作出其残量网络。 为了解释反向边的作用,我们考虑不使用反向边的情况下,所得出的结果。 下图为不包含

crella___的博客 2456

YOLOv8源码解析与复现:ShuffleAttention:高效的混合注意力机制 实现通道和空间混合注意力

随着深度学习在计算机视觉领域的飞速发展,卷积神经网络(CNNs)已经成为图像分类、目标检测、语义分割等任务的核心。为了进一步提升模型的性能,研究者们引入了“注意力机制”,旨在让网络能够动态地关注输入数据中最具信息量的部分。经典的注意力模块,如SE-Net(Squeeze-and-Excitation Networks)和CBAM(Convolutional Block Attention Module),通过通道注意力或结合通道与空间注意力,显著增强了模型的特征表达能力。

FJN110的博客 555

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

关于最大流的EdmondsKarp算法详解

      最近大三学生让我去讲课,我就恶补了最大流算法,笔者认为最重要的是让学弟学妹们入门,知道算法怎么来的?为什么是这样?理解的话提出自己的改进,然后再看看Dinic、SAP和ISAP算法….. 一、概念引入       首先要先清楚最大流的含义,就是说从源点到经过的所有路径的最终到达汇点的所有流量和。       流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负容...

weixin_33862993的博客 1186

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

最大流__EdmondsKarp算法

#include<iostream> #include<queue> using std::cin; using std::queue; const int size = 201; int Gf[size][size] = {0}; int pre[size] = {0}; int visited[size] = {0}; int n,m; int BFS(int sr...

weixin_44110392的博客 393

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

网络流(一)最大流问题EdmondsKarp和最小费用最大流

一、最大流问题 如下图所示,假设需要把一些物品从结点S(称为源点)运送到结点t(称为汇点),可以从其它结点中转。每条边上的权值(左图)表示该条路径最多能运送的物品数,右图边上的权值第一个数表示实际运送的物品数目(flow),第二个数表示最多能运送物品的数目(即容量capacity),也称为题目中的上限。 最大流问题的三个性质: (1)容量限制:f(u,v)<c(u,v),即每条边的流量...

万万VV 1316

hdu 1532 Drainage Ditches(网络流之最大流EdmondsKarp)

看了一上午终于看懂了最大流EdmondsKarp算法。。。关键是要清楚残余网络的作用,这里引用下郭炜老师的课件。 理解完了上面的图就很好办了,每次都寻找残余网络,然后在残余网络上找出新的路径。再找新的残余网络……知道找不出新的残余网络为止。 HDU1532基本是裸的题 题目地址: http://acm.hdu.edu.cn/showprobl

ACMan 378

poj-3436-记录路径的最大流-edmondskarp

上午终于把最大流搞懂了,下午独立的做了一道题目,这道题目牵扯到如何记录最大流流过的路径问题。 想了好久,然后有好好的探索了一下edmondskarp算法的核心思想,发现每次的增光路都可以作为条通径。 这样的话就简单了,每次添加增光路的时候,用另一个数组记录一下增光路的添加路线,到后来用的时候, 再依次从数组中取出增光路的添加路线。 #include #include #include #i

青竹梦 1649

深圳大学-算法设计与分析-实验6-最大流应用问题

三种算法的应用范围Edmonds-Karp:适用于中小规模图,广泛用于教学和基础应用。Push-Relabel: 适用于大规模图和复杂网络流问题,通过优化可以实现高效计算。Dinic: 适用于稀疏图和分层网络,在某些特殊情况下可以非常高效。优化与改进Edmonds-Karp:优化空间有限,主要通过改进 BFS 实现和减少冗余计算来提升性能。Push-Relabel:可以通过多种优化技术提升性能,如使用动态树数据结构、全局重标号、以及 gap heuristic。

纯粹的摆烂狗的博客 1418

【最大流之EdmondsKarp算法】【HDU1532】模板题

题意:裸的最大流,什么是最大流,参考别的博客 运用复杂度最高的EK算法 O(M*N),模板来自紫书 #include #include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3f #define oo 0x1313

学习之路 582

最大流EdmondsKarp算法

略略略

Bule-Zst的博客 1043

EdmondsKarp算法求最大流

EdmondsKarp算法是Ford-Fulkerson算法的特例,区别在于Ford-Fulkerson算法没有给出残存网络中增广路径的寻找方法,而EdmondsKarp算法使用广度优先搜索寻找增广路径。找到增广路径后沿其递增流,得到更大的流,重复下去直到残存网络不存在增广路径为止。具体见算法导论(第三版):26.2节。算法实现如下(C++)

naturerun的博客 222

网络流EdmondsKarp算法模板理解

先推荐一个讲网络流的博客,我的网络流知识均吸收于此   传送门EdmondsKarp算法基本思想:从起点到终点进行bfs,只要存在路,说明存在增广路径,则取这部分路 权值最小的一部分,即为增广路径(也就是这一部分路的最大流量)。然后将这条路上的正向权值都减去min,反向权值都加上min(即,m[i][j]-min,m[j][i]+min,为什么等会再解释)。然后重复此操作,最终就得到了最大流。先上...

ysk850874665的博客 366

最大流模板【EdmondsKarp算法,简称EK算法,O(m^2n)】

首先来看一下基本的网络流最大流模型。 有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点,通常规定为1号点。另一个点也很特殊,只进不出,叫做汇点,通常规定为n号点。每条有向边上有两个量,容量和流量,从i到j的容量通常用c[I,j]表示,流量则通常是f[I,j]。通常可以把这些边想象成道路,流量就是这条道路的车流量,容量就是道路可承受的最大的车流量。很显然的,流量...

bandiaodai5734的博客 101
上一篇: mapreduce推荐
下一篇: 图的最大流-通用推送标签方法
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值