网络流模板:最大流ISAP算法和Dinic算法

SAP和ISAP(网路最大流的两个增广路算法) ISAP是对SAP进行优化后的算法,ISAP时间复杂度为O(V^2E),SAP的时间复杂度为O(VE^2)   SAP #include <iostream> #include <algorithm> #include <iomanip> #include <queue> using namespace std; const int ... 阅读详情

ISAP:

 

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define N 505
#define inf 999999999
using namespace std;

int n,m,s,t,dis[N],pre[N],gap[N],flow[N][N];
struct edge
{
	int v,w;
	edge *next,*rev;
	edge(){next=0;}
	edge(int vv,int ww,edge *e){v=vv;w=ww;next=e;}
}*adj[N],*path[N],*e;
void insert(int u,int v,int w)
{
	edge *p=new edge(v,w,adj[u]);
	adj[u]=p;
	edge *q=new edge(u,0,adj[v]);
	adj[v]=q;
	p->rev=q;
	q->rev=p;
}
void bfs()
{
	memset(dis,0x7f,sizeof(dis));
	memset(gap,0,sizeof(gap));
	queue<int> q;
	dis[t]=0;
	gap[0]=1;
	q.push(t);
	while(q.size())
	{
		int x=q.front();
		q.pop();
		for(e=adj[x];e;e=e->next)
		{
			if(e->rev->w==0||dis[e->v]<t)
				continue;
			dis[e->v]=dis[x]+1;
			++gap[dis[e->v]];
			q.push(e->v);
		}
	}
}
int ISAP()
{
	memset(dis,0,sizeof(dis));
	memset(gap,0,sizeof(gap));
	//bfs();
	int ans=0,u=s,d;
	while(dis[s]<=t)
	{
		if(u==t)
		{
			int minflow=-1u>>1;
			for(e=path[u];u!=s;e=path[u=pre[u]])
				minflow=min(minflow,e->w);
			for(e=path[u=t];u!=s;e=path[u=pre[u]])
			{
				e->w-=minflow;
				e->rev->w+=minflow;
				flow[pre[u]][u]+=minflow;
				flow[u][pre[u]]-=minflow;
			}
			ans+=minflow;
		}		
		for(e=adj[u];e;e=e->next)
			if(e->w>0&&dis[u]==dis[e->v]+1)
				break;
		if(e)
		{
			pre[e->v]=u;
			path[e->v]=e;
			u=e->v;
		}
		else
		{
			if(--gap[dis[u]]==0)
				break;
			for(d=t,e=adj[u];e;e=e->next)
				if(e->w>0)
					d=min(d,dis[e->v]);
			dis[u]=d+1;
			++gap[dis[u]];
			if(u!=s)
				u=pre[u];
		}
	}
	return ans;
}
int main()
{
	int u,v,w;
	while(~scanf("%d%d",&m,&n))
	{
		memset(adj,0,sizeof(adj));
		while(m--)
		{
			scanf("%d%d%d",&u,&v,&w);
			insert(u,v,w);
			//insert(v,u,w);//无向边
		}
		s=1;
		t=n;
		printf("%d\n",ISAP());
	}
}
/*
6 5
3 4 5
4 5 5
1 2 10
2 3 10
1 3 20
2 5 20

*/


 

Dinic:

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 5005
#define M 10005
#define inf 999999999
using namespace std;

int n,m,s,t,num,adj[N],dis[N],q[N];
struct edge
{
	int v,w,pre;
}e[M];
void insert(int u,int v,int w)
{
	e[num]=(edge){v,w,adj[u]};
	adj[u]=num++;
	e[num]=(edge){u,0,adj[v]};
	adj[v]=num++;
}
int bfs()
{
	int i,x,v,tail=0,head=0;
	memset(dis,0,sizeof(dis));
	dis[s]=1;
	q[tail++]=s;
	while(head<tail)
	{
		x=q[head++];		
		for(i=adj[x];i!=-1;i=e[i].pre)
			if(e[i].w&&dis[v=e[i].v]==0)
			{
				dis[v]=dis[x]+1;
				if(v==t)
					return 1;
				q[tail++]=v;
			}
	}
	return 0;
}
int dfs(int s,int limit)
{
	if(s==t)
		return limit;
	int i,v,tmp,cost=0;
	for(i=adj[s];i!=-1;i=e[i].pre)
		if(e[i].w&&dis[s]==dis[v=e[i].v]-1)
		{
			tmp=dfs(v,min(limit-cost,e[i].w));
			if(tmp>0)
			{
				e[i].w-=tmp;
				e[i^1].w+=tmp;
				cost+=tmp;
				if(limit==cost)
					break;
			}
			else dis[v]=-1;
		}
	return cost;
}
int Dinic()
{
	int ans=0;
	while(bfs())
		ans+=dfs(s,INT_MAX);
	return ans;
}
int main ()
{
	while(~scanf("%d%d",&m,&n))
	{
		int u,v,w;
		memset(adj,-1,sizeof(adj));
		num=0;
		s=1;
		t=n;
		while(m--)
		{
			scanf("%d%d%d",&u,&v,&w);
			insert(u,v,w);
		}
		printf("%d\n",Dinic());
	}
}


 

网络流最大流算法(ISAP算法及DINIC算法) 这些算法网络中解释都有,所有以下是根据题目应用,代码中有注释,方便理解,ISAP算法就是通过先bfs一遍建立逆序求层数,然后每次都进行维护求最短路来求增广路径,DINIC即是通过顺序,每次找最短路径前都进行一次层次的划分,再来求最短路增广路径,直至无法划分层次出现断层。下面用两个方法来做这道题,可以作为模板使用 题目:http://acm.split.hdu.edu.cn/showproblem 阅读详情

相关推荐

网络流Dinic算法详解及模板

在程序里,p表示找到的增广路径,p.top为路径中的最后一个顶点。一开始,p中只有源点。 整个While循环分为2个操作。如果p的最后一个顶点为汇点,也就是说找到了增广路,那么对p增广,注意到增广后一定有一条或多条p中的边被删除了。这时,我们使增广路径后退至p中从源点可到达的最后一个顶点。 如果p的最后一个顶点不为汇点,那么观察最后那个的顶点u 。若在层次图中存在从u连出的一条边,比如(u,v),我们就将顶点v放入路径p中,继续dfs遍历;否则,点u对之后的dfs遍历就没有用了,我们将点u以及层次图中连到u

以中有足乐者... 1万+

最大流算法-ISAP

引入 最大流算法分为两类,一种是增广路算法,一种是预留推进算法。增广路算法包括时间复杂度\(O(nm^2)\)的EK算法,上界为\(O(n^2m)\)的Dinic算法,以及一些其他的算法。EK算法直接进行增广,而Dinic则是通过沿着最短路增广优化了复杂度,它的做法是每次进行bfs求出层次图,再dfs沿着层次图进行多路增广。然而,Dinic中每次进行bfs求层次图似乎有点浪费,因为层次图...

dengtan9179的博客 407

【笔记】网络流算法模板

Dinic 算法其实是 EK 算法的一个暴力的优化,EK 算法每次只能搜索一条增广路径,而 Dinic 算法每次都用 DFS 的形式尽可能多的搜索增广路径。而图中可能存在环,为了保证 DFS 的过程中不会造成死循环,这里可以使用分层图,这样每次都是一层一层往下搜索,就不会出现死循环。因此跑最大流的 Dinic 板子即可,代码没有任何区别,就不再放了。图,并给定每条边的容量和费用,边的容量非负。的最大流,以及在流量最大时的最小费用。图,并给定每条边的容量,边的容量非负。图,并给定每条边的容量,边的容量非负。

星河依旧长明的博客 1027

图论 —— 网络流 —— 最大流 —— SAP 算法与 ISAP 算法

【概述】 EK 算法直接进行增广,而 Dinic 则是每次进行 bfs 求出层次图再 dfs 沿着层次图进行多路增广。 然而,Dinic 中每次进行 bfs 求层次图有些浪费,因为层次图的改动并不是很大,在这种思路下,因此考虑直接在每次 dfs 增广的时候修改层次图来优化求最短路的过程。 SAP(Shortest Augment Path),顾名思义是找最短的增广路,将 EK 算法 O(V*...

Alex_McAvoy的博客 1262

isap最大流模板

isap模板

最大流的Dinic算法与SAP算法的实现

最大流的Dinic算法与SAP算法的实现,分别包括递归与非递归版本,对稀疏图效果较好。

最大流的 Dinic 算法和 ISAP 算法

上期回顾:https://www.cnblogs.com/ofnoname/p/18678895 之前我们已经介绍了最大流问题的基本定义、最大流最小割定理、增广路径与残量网络的构建方法,以及如何利用这些概念实现 EK 算法。EK 算法通过每次使用 BFS 寻找从源点到汇点的最短增广路径,保证了算法在

fenfenfen520a的博客 99

ISAP算法模板

原题为USACO 草地排水 模板,网络流,最大流,ISAP算法 虽然可能写的不怎么好看但是带一些注释,应该可以看懂吧。

对于网络流算法中Dinic与ISAP的效率比较

luogu 模板题 P3376 网络最大流 作者自测,可能因为代码习惯等原因常数不同,个人的整理 对此题,目前使用两种算法,均ACACAC DinicDinicDinic 970ms970ms970ms DinicDinicDinic + 当前弧 762ms762ms762ms DinicDinicDinic + 当前弧 + 多路增广 162ms162ms162ms ...

一只萌新 1154

网络流之Isap算法(PPT)

网络流的isap图片集(当ppt看),多看看,在参考点论文就能入门了》。。

2025年(第十一届)全国大学生统计建模大赛论文及选题分析

基于数据驱动决策:整个研究围绕给定的洪水灾害相关数据进行深入挖掘和分析,从数据清洗、特征分析、模型建立到最终预测,每一步都以数据为基础,通过对数据的有效利用来揭示洪水灾害发生的相关规律和特征,为洪水灾害的风险评估和预测提供依据,符合数据引领未来决策的理念。实际应用导向:洪水灾害是现实中严重影响人类生命财产安全和社会经济发展的重要问题,本研究旨在实现对洪水灾害的预测,其成果可直接应用于防洪减灾工作,如洪水预警、风险评估与区划等,对实际防灾减灾工作具有重要的指导意义,体现了以数据为支撑服务实际应用的特点。

qq_52590045的博客 1万+

网络流 最大流 最小割 费用流

【腾讯文档】网络流初步 网络流初步 文章目录网络流初步一、网络流简介1. 网络2. 流3. 再次理解网络流二、常见题型(三种)三、相关问题对应算法介绍1.最大流(1) FF算法 - Ford-Fulkerson算法(2)EK算法 - Edmonds-Karp增广路算法(3)Dinic算法(4)ISAP算法总结2.最小割最大流最小割定理割(CUT)3.费用流 问题: 一、网络流简介 网络流是算法竞赛中的一个重要的模型,它有两个部分:网络和流。 图片来源 1. 网络 网络就是一张有向图 G = (V,E)。

SZTU_ZJB的博客 3163

OpenWRT软件源更换保姆级教程:从国内镜像到官方源一键切换(含常见报错解决)

本文提供OpenWRT软件源更换的详细教程,涵盖从国内镜像源到官方源的切换方法,并深度解析常见报错解决方案。针对国内网络环境,指导用户如何精准定位系统信息、备份配置、选择并配置清华等国内镜像源,以及处理签名验证失败、依赖缺失、404错误等典型问题,旨在提升软件包管理效率与稳定性。

weixin_29229261的博客 1942

算法学习笔记:网络流#4——ISAP 求解最大流

算法学习笔记:网络流#4——ISAP 求解最大流1. 前言2. 模板2.1 详解2.2 正确性证明2.3 代码3. 算法对比3.1 一般数据下的对比3.2 特殊数据下的对比 1. 前言 本篇博文将会重点讲解 ISAP 求解最大流。 ISAP 求解最大流,是目前笔者知道的 除了 HLPP 之外的速度最快的最大流算法。 在学习 ISAP 求解最大流之前,您需要对以下知识有所了解,包括但不限于:网络流基础定义,FF/EK 求解最大流的 思路,dinic 求解最大流的 代码实现。 如果您对上述部分内容不熟悉,可以前

Plozia 的小窝 1114

猫耳语音下载(mediadown)

西宾猫耳语音下载工具,能够帮助你下载猫耳音频节目。如果你是会员,它还能帮你下载会员节目。

new_stranger的专栏 2492

全网最全 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置

昨天(2024年7月23日)我们分享了学生及科研人员电脑配置推荐 | 笔记本+外置显卡配置,性能足够支持完成你博士论文文本内容,那么今天我们就分享一文解决 | Linux(Ubuntn)系统安装 | 硬盘挂载 | 用户创建 | 生信分析配置的教程,我们使用一文来解决大家在做生信时遇到安装系统、配置环境的问题。在此文中,我们尽快可能给出一套全网最全的教程。目标是解决新手小白同学查资源的困惑和难题。但是,每个童鞋遇到的问题不一样,此教程也不可能把你遇到的每个问题都归纳在其中。我们也希望,

BioinfoDu 2261

网络流模板 Dinic ISAP HLPP 最小费用最大流 最小割 建图技巧

参考博客: https://blog.youkuaiyun.com/Calix_Guo/article/details/80554268 最大流模板: #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define INF 0x3f3f3f3f using namespa...

xiji333的博客 904

“傻瓜”stata入门——熟悉操作界面

小白开始学习stata和matlab,零基础上手

nnpersistent的博客 4459

【图论】网络流

网络流目前只整理模板,学习的话这篇博客可能不太适合下文建图方式都基于链式前向星,请注意,cnt。

Texcavator的博客 3191

Windows 11/10系统盘被BitLocker锁了别慌!手把手教你用manage-bde命令找回密钥并解锁

本文详细介绍了当Windows 11/10系统盘被BitLocker锁定后的恢复方法,重点讲解了如何使用manage-bde命令行工具找回密钥并解锁加密驱动器。通过进入Windows恢复环境、诊断锁定状态、提取恢复密钥ID以及执行解锁操作等步骤,帮助用户有效解决BitLocker锁定问题,同时提供了后续防护优化建议和高级故障排除技巧。

weixin_42542669的博客 1465

Tribon Vitesse开发教程(一)

Tribon Vitesse简介 Tribon Vitesse是Tribon提供给Python编程语言的编程接口,它是一系列的API。使用Python的语法调用这些API,结合Python语言自身的语法生成的程序叫做Vitesse程序。Vitesse是法语“速度”的意思,读作“为戴斯”。使用Tribon Vitesse可以直接访问Tribon产品信息模型和使用Tribon应用程序的功能,以控制设计

forevermemory的专栏 2593

我的模板 最大流(Dinic & Isap)+最小费用最大流(SPFAFlow)==有更改

今天刻意用poj 3469 http://poj.org/problem?id=3469测了下模板,Isap并不像想象中那么快,难道是我写搓了,而且在网络流与线性规划中的最后一题,isap完败给Dinic了,我的Isap啊~~~不知道那些几百毫秒出解的是用什么算法。。。难道是。。。    dinic总体上挺不错的,递归版的Isap基本上与Dinic没差别,而非递归版在某些情况反而不如递归版,于是

志当存高远 4742

国科大学习资料--人工智能原理与算法-2021年期末考试题解析(学长整理)

国科大学习资料–人工智能原理与算法-2021年期末考试题解析(学长整理) 国科大学习资料–人工智能原理与算法-2021年期末考试题解析(学长整理) 国科大学习资料–人工智能原理与算法-2021年期末考试题解析(学长整理) 根据学弟的反馈,该年的期末题只有5道,且均是作业题(所以大家一定要积极完成作业,考前多做几遍!!!!) 下面解析: 3.25 由于该题,我没有做过,所以只能给你英文版的答案。答案如下,其他的题目答案都是中文版。 5.9 8.10 12.20 15.13 ...

无名何许人的博客 3981

网络流最大流(FF、Dinic)详解

网络流基础概念 考虑这幅图,你可以看成从村庄s到村庄t有很多条物流道路,每个点都是个中转结点,每条路的权值即该条路最多能运送的货物 介绍一些基本概念: 网络:一个入度为0的点s,一个出度为0的点t,每条边有自己权值的有向图 容量:当前边上的权值,比如SA的容量即为3 源点:入度为0的点,通常s来表示 汇点:出度为0的点,通常t来表示 流:一个合法解称作一个流,也就是一条可以从源点到汇点的一条合法路径。 流量:每条边各自运送的包裹数称作其流量,最终收集的总数为整个流的流量。边上的流量:f(SA)=2,代表今

weixin_43945141的博客 3575

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

网络流 (讲解 + 模板) ----- 详细

文章目录网络流Dinic算法 网络流 感谢博主 : https://www.cnblogs.com/rmy020718/p/9546071.html 感谢博主 : https://www.cnblogs.com/hyserendipity/p/8560525.html 感谢博主 : https://blog.youkuaiyun.com/weixin_43907802/article/details/84705855 感谢博主 : https://www.cnblogs.com/passione-123456/p/12

沐白白的博客 3741

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 百度之星趣味赛——AK咆哮体
下一篇: 彻底的失败,严重的打击。。。
power721
博客等级 码龄19年 176粉丝 135原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值