算法设计与分析 实验五图论-桥

这篇具有很好参考价值的文章主要介绍了算法设计与分析 实验五图论-桥。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的:

(1)掌握图的连通性。
(2)掌握并查集的基本原理和应用。

二、问题描述:

  1. 桥的定义
    在图论中,一条边被称为“桥”代表这条边一旦被删除,这张图的连通块数量会增加。等价地说,一条边是一座桥当且仅当这条边不在任何环上。一张图可以有零或多座桥。
    算法设计与分析 实验五图论-桥

图 1 没有桥的无向连通图
算法设计与分析 实验五图论-桥
图 2 这是有16个顶点和6个桥的图
(桥以红色线段标示)

三、算法设计原理:

1.基准法
1)算法流程:计算图的连通块数,遍历每一条边,将其从图中删除,然后计算图的连通块数与原图是否相同,如果不相同,则该边为桥,再将该边添加回图中。

计算图的连通块数:遍历每个点的邻接表,给其上色,颜色数即为连通块数。

如下图1所示:原图中有四种颜色,即四个连通分量
图2为删除一条边后,图中有五种颜色,即五个连通分量
算法设计与分析 实验五图论-桥
图1 原图
算法设计与分析 实验五图论-桥
图2 删除边后

2)伪代码

计算连通块数
SBLOCK()
	for i = 0 to n:
		if !st[i]:
			dfs(i)
			sblock++

计算桥的个数		
CNTBRIDGE()
	for i = 0 to m:
		reset(st)
		
		Remove(edge[i])
		
		cnt = 0
		
		for j = 0 to n:
			if !st[i]
				dfs(j)
				cnt++
		
		if cnt > sblock
			ans++
		
		add(edge[i])

2)LCA+并查集
基准法的缺陷
基准法:删除每一条边后,判断连通块数量是否增加。算法的效率慢。

因为一条边是一座桥当且仅当这条边不在任何环上。树是边数最小的无环图,向树上添加任意一条两个顶点都在树上的边,必定会形成环,所以桥一定是生成树上的边。

如下图3、4所示,向生成树中加入非树边后,一定会形成环,而环上的边一定不是桥。
算法设计与分析 实验五图论-桥
图3 原图
算法设计与分析 实验五图论-桥

图4 加边

LCA(最小公共祖先)
定义:一棵树中,两个节点的最近公共祖先

LCA算法流程:比较两个点的深度,深度大者移动到其前驱节点,再次比较,以此类推,直到两个点重合。

并查集
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。

创建:每个点的前驱节点都是自己,也就是每个点都是自己的根节点。这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(n)
算法设计与分析 实验五图论-桥
图5 并查集的创建

合并:遍历每条边,找其根节点,如果根节点不同,将两个元素所在的集合合并为一个集合。

如下图6中,2的根节点为2,1的根节点为1,加上一条边后,因为两个节点的根节点不同,所有选择让2的前驱指向1
算法设计与分析 实验五图论-桥
图6 原图
算法设计与分析 实验五图论-桥

图7 加边

算法设计与分析 实验五图论-桥
图8 合并
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用下面的“查找”操作实现。
查找:找其前驱节点,直到找到根节点

算法设计与分析 实验五图论-桥
图9 找到节点4的前驱节点

算法设计与分析 实验五图论-桥

图10 找到节点4的根节点1

查找优化:压缩路径
压缩路径过程:让其前驱节点直接指向其根节点
算法设计与分析 实验五图论-桥
图11 普通查找

算法设计与分析 实验五图论-桥

图12 路径压缩

(1)算法流程:通过bfs生成树,遍历所有非生成 树的边,求边的两个顶点的LCA(最小公共祖先),把形成环的生成树边记录为非桥。

(2)伪代码

通过bfs计算连通块的个数
SBLOCK()
	for i = 0 to n:
		if !st[i]:
			bfs(i)
			sblock++

LCA+并查集
LCA(a, b)
	if tree_pre[a] == b || tree_pre[b] == a
		return 
			
	sonA = a, sonB = b
	
	while a != b:
		if depth[a] < depth[b]
			st[b] = false
			b = tree_pre[b]
		elif depth[a] > depth[b]
			st[a] = false
		else 
			st[a] = false
			st[b] = false
			a = tree_pre[a]
			b = tree_pre[b]
	// 压缩路径
	for i = sonA to i !=a:
		temp = tree_pre[i]
		tree_pre[i] = a
		i = temp
	
	for i = sonB to i != b:
		temp = tree_pre[i]
		tree_pre[i] = b
		i = temp

(3)时间复杂度为O(m+n)

四、实验结果分析:

1.附件数据

小规模 中图 大图
基准法 0.997ms 5.984ms TLE
并查集+LCA <1μs <1μs 356.058ms
6 0 8

算法设计与分析 实验五图论-桥
图 小规模
算法设计与分析 实验五图论-桥
图 大图

2.稀疏图

点数n 边数m 压缩路径(ms) 没有压缩路径(ms)
1000000 4000000 344.772000 378.453
2000000 4000000 354.858000 383.825
3000000 4000000 370.386000 381.616
4000000 4000000 378.381000 404.372

3.稠密图
m = nn0.48

点数n 边数m 压缩路径(ms) 没有压缩路径(ms)
1000 480000 8.979 12.686
2000 1920000 48.95 49.779
3000 4320000 126.659 117.151
4000 7680000 226.607 229.36

五、实验结论:

(1)邻接表和邻接矩阵的选择:
1.稀疏图-邻接表,稠密图-邻接矩阵
2.数据量较大时,选择邻接表,因为邻接矩阵需要的空间大

(2)建立生成树
1.选择dfs,数据量大时容易发生栈溢出

(3)递归层数多,可以考虑将递归改为递推
递归需要不断调用函数,不断进行出栈和入栈的操作

代码与数据
建议自己写,不要直接CV
https://download.csdn.net/download/weixin_50325452/85533171文章来源地址https://www.toymoban.com/news/detail-464209.html

到了这里,关于算法设计与分析 实验五图论-桥的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法设计与分析实验:动态规划与贪心

    目录 一、零钱兑换 1.1 思路一:动态规划 1.2 思路二:贪心 二、安排工作以达到最大效益 2.1 具体思路 2.2 思路呈现 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、雇佣k名工人的最低成本 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行结果 结尾语 “生活有意思的

    2024年02月19日
    浏览(77)
  • 算法设计与分析实验:DFS与BFS

    目录 一、边界着色 1.1 思路一:DFS 1.2 思路二:BFS 二、课程表II 2.1 思路一:DFS 2.2 思路二:拓扑排序 三、岛屿的最大面积 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行结果 2024-1-31 阴 力扣第1034题 (1)具体思路: 首先,定义一个dfs函数,用于搜索和染色连通

    2024年02月21日
    浏览(35)
  • 算法设计与分析—动态规划作业一(头歌实验)

    任务描述 本关任务:求一个序列的最长上升子序列。 相关知识 最长上升子序列问题 当一个序列 Bi 满足 B1 B2 ... Bs 的时候,我们称这个序列是 上升 的。对于给定的一个序列 a1, a2, ..., aN ,我们可以在其中找到一些上升的子序列。 现在给你一个序列,请你求出其中 最长 的上

    2024年02月04日
    浏览(136)
  • 算法设计与分析—动态规划作业二(头歌实验)

    任务描述 本关任务:计算寻宝人所能带走的宝物的最大价值。 一个寻宝人在沙漠中发现一处神秘的宝藏,宝藏中共有 n 个宝物( n 不超过 20 ),每个宝物的重量不同,价值也不同,宝物 i 的重量是 wi ,其价值为 vi 。 寻宝人所能拿走的宝物的总重量为 m ( m 不超过 50 )。请

    2024年02月06日
    浏览(74)
  • 南邮|算法分析与设计实验二 动态规划法

    目录 实验目的 实验内容 实验步骤 一、最长公共子序列 二、矩阵连乘  加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的 最长公共子序列问题 和 矩阵连乘问题 ,体会 动态规划法 和 备忘录方法 的异同。 一、用动态规划法和备忘录方法

    2024年02月01日
    浏览(45)
  • 【算法设计与分析】第七至十一讲实验

    1. 实验题目 给定一个非负整数的数组,每个数字表示在当前位置的基础上最多可以走的步数。求能够到达数组最后一个位置所需的最少移动次数。如果不能到达,则输出-1。 例如:        输入数组 [2,3,1,1,4],输出2——第一步从下标0移动1步到下标1,再移动3步到最后一个位

    2024年02月06日
    浏览(33)
  • 编译原理实验三:算符优先分析算法的设计与实现

    实验三 算符优先分析算法的设计与实现 一、 实验目的 根据算符优先分析法,对表达式进行语法分析,使其能够判断一个表达式是否正确。通过算符优先分析方法的实现,加深对自下而上语法分析方法的理解。 二、 实验要求 1、输入文法。可以是如下算术表达式的文法(你

    2024年02月06日
    浏览(57)
  • 中北大学算法分析与设计实验报告六(最大团问题)

    1.实验名称 实验六 回溯与分支限界算法实验 2.实验目的 题目:最大团问题 强化学生利用回溯算法和优化处理实际问题的能力。 3.训练知识点集群 (1)根据实验内容设计算法伪代码进行算法描述; (2)利用C++/C/Java等编程语言对算法伪代码进行工程化实现; (3)输入测试用

    2024年02月06日
    浏览(42)
  • 中北大学算法分析与设计实验报告三(数字旋转方阵)

    1.实验名称 实验三 分治与减治算法实验 2.实验目的 (1)掌握分治法的设计思想; (2)掌握数字旋转方阵的具体实现过程; (3)熟练掌握二维数组的使用方法; (4)在掌握的基础上编程实现数字旋转方阵的实现过程。 3.训练知识点集群 (1)根据实验内容设计算法伪代码

    2023年04月08日
    浏览(76)
  • 王红梅《算法设计与分析(第3版)》部分课后实验代码

    【教材信息】 书名:算法设计与分析(第3版) ISBN:9787302594390 作者:王红梅   【递推法:杨辉三角形】 【分治法:九连环问题】 【贪心法:田忌赛马】 【动态规划法:数塔问题】  

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包