增广路算法 DFS求解 最大网络流问题

news/2024/7/20 22:46:49 标签: 算法, 深度优先, 图论

最大网络流问题

最大网络流问题是这样的,有一个有向图,假定有一个源点,有一个汇点,源点有流量出来,汇点有流量进入,有向图上的边的权重为该条边可通过的最大流量(方向为边的方向),问从源点到汇点这条路径上,可以通过的流量总和最大是多少?注意并不一定是只有一条路径,多条路径加起来只要不冲突也行。

DFS求解增广路算法

首先作几点额外的说明:


1.可以认为A[i][j]表示从i到j的可行流,A[j][i]表示从j到i的可行流,A[i][j]+A[j][i]始终是保持不变的
2.初始时若A[i][j]非零则A[j][i]必然为0,若A[i][j]为INF则A[j][i]必然也为INF,对角线上必然都是INF
3.下面步骤中描述的左值为与图中箭头方向相同的可行流,右值为与图中方向相反的可行流
(默认源点只出不进、汇点只进不出)


思路

增广路算法的步骤
step1:设置visit访问标记数组,flag标记用于检查此次dfs是否寻找到final,set集合用于存放当前路径上的点
step2:循环step3
step3:从源点开始dfs,如果flag=0则继续下面步骤。

  • 如果发现进入到汇点则置flag=1, 并将此次dfs路径上的左值减去min,右值加上min;
  • 如果没有进入final则继续进行dfs,对符合条件的顶点标记访问并将其加入set集合

step4:统计m[i][start]或m[final][i]的和,也就是源点此时出去的流量总和或者汇点流量进入的总和,此结果即为最大网络流问题的解

代码

#include"iostream"
using namespace std;
#define Maxn 100
#define INF 1e9

int m[Maxn][Maxn]=// 对应下图 
{
{INF,5,2,INF,INF},
{0,INF,0,2,4},
{0,1,INF,0,INF},
{INF,0,1,INF,1},
{INF,0,INF,0,INF} 
};
int n=5,start=0,final=4,Min,len,set[Maxn],visit[Maxn]; 
int flag;
void FF(int v)
{
	if(flag==1)// 每次只进行一次dfs 
		return ;
	if(v==final)// 找到汇点 标记置1 并对沿途路径上的边权值做更改
	{
		flag=1;
		for(int i=0;i<len-1;i++)
		{
			m[set[i]][set[i+1]]-=Min;
			m[set[i+1]][set[i]]+=Min;
		}
	}
	for(int i=0;i<n;i++)
	{
		if(m[v][i]!=0&&m[v][i]!=INF&&visit[i]==0)
		{
			if(m[v][i]<Min)
				Min=m[v][i];
			visit[i]=1;
			set[len++]=i;
			FF(i);
			len--;
			visit[i]=0;
		}
	}
}
// 统计源点出去的流量
void Print()
{
	int res=0;
	for(int i=0;i<n;i++)
	{
		if(m[i][start]!=INF)
			res+=m[i][start];
	}
	cout<<"result:"<<res<<endl;
}
int main()
{
	while(1)
	{
		Min=INF; // 这里不要忘了 
		for(int i=0;i<n;i++)
			visit[i]=0;
		visit[start]=1; // 这里不要忘了 
		set[len++]=start;
		FF(start);
		if(flag==0)
			break;
		flag=0;
	}
	Print();
	return 0;
} 

增广路算法对应的图如下
在这里插入图片描述


http://www.niftyadmin.cn/n/5314908.html

相关文章

免费用chatGPT

免费用chatGPT&#xff0c;地址&#xff1a; DocGPT - 第二大脑

数仓规范管理

一、背景&#xff1a; 谈到数仓规范&#xff0c;我们都会讲到数据建模和数仓分层&#xff0c;讲数仓会做数仓横向做数仓分层用于降低数据开发复杂程度和数据复用。纵向我们常说主体域划分和数据域划分&#xff0c;用于解决数据分类管理问题。这类的文章很多都是讲数据模型如何艰…

SpringBoot用MultipartFile.transferTo传递相对路径的问题

问题描述&#xff1a; 打算给自己的项目添加一个上传文件保存功能&#xff0c;于是我使用MultipartFile.transferTo()来完成这个功能&#xff0c;由于我的项目要部署到服务器&#xff0c;所以我使用了相对路径把上传的文件保存到当前项目的工作目录下&#xff0c;但是报错了&am…

命令行重置kafka消费最新数据 —— 筑梦之路

kafka消费能力不足&#xff0c;消息积压太多&#xff0c;现需要重置消费&#xff0c;使其消费最新的数据 kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group test_topic_group1 --reset-offsets --topic test_topic --to-latest --execute Kafka 数据积压…

springboot项目创建及采用本地tomcat打包发布

springboot项目发布 maven使用 解压maven安装包 修改配置文件settings.xml 更改镜像(使用maven添加依赖时&#xff0c;选择下载的地址&#xff0c;百度云已提供) <mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyu…

常孝元宇宙《神由都城》发布会成功召开

2024年1月9日,2024常孝元宇宙《神由都城》发布会在北京市中国科技会堂举办,由中国移动通信联合会元宇宙产业工作委员会主办,常州神由之星数字信息产业发展有限公司、常州孝道文化产业股份有限公司共同承办。 本次发布会以“创新引领、协同发展”为主题,邀请第十二届全国政协副主…

postgresql 流复制原理

这部分纯理论内容&#xff0c;结合配图和数据进程了解流复制的工作逻辑。 通过WAL完成复制的方式 PostgreSQL在数据目录下的pg_wal(旧版为pg_xlog)子目录中维护了一个WAL日志文件&#xff0c;该文件用于记录数据库文件的每次改变&#xff0c;这种日志文件机制提供了一种数据库…

WAF(Web应用防火墙)全面解析

Web应用防火墙&#xff08;WAF&#xff09;是确保网络安全的重要工具&#xff0c;尤其在保护Web应用免受各种网络攻击方面发挥着至关重要的作用。以下是关于WAF的各方面详细介绍&#xff1a; 定义和目的 WAF是一种特殊类型的防火墙&#xff0c;专门设计用于监视、过滤和阻挡进…