C++算法篇:DFS超详细解析(2)--- tarjan算法求无向图割边
<<<上一篇
系列文章目录
①:无向图基本概念
②:tarjan算法求无向图割边
前言
第一次写算法,讲得肯不透彻,有误还请指教awa
文章目录
- 系列文章目录
- 一、回顾
- 二、tarjan算法
- 2.1、求割边并输出
- 2.2、求连通分量
一、回顾
先来回顾一下dfs的基本框架:
//存图方式:vector(g[N])
void dfs(int u){//u:当前节点vis[u]=true;for(int& v:g[u]){//访问u连到的每个节点if(!vis[v]) dfs(v);}
}
二、tarjan算法
请注意,这里讲的仅限于无向图,有向图的算法会稍有不同。
- 首先我们可以确定的是回边一定不是桥1。
- 那么就只需要判断树边了。
回顾割边的定义,删边后两端断开,那么就意味着一端的点永远无法通过一条路径回到另一端,在DFS-tree上就体现为下方的节点永远无法通过非树边回到上方的点。如果成立,即只能通过树边相连,那么这条树边就是桥了!(因为是树,每个节点以自己为终点只会有一个直系父亲)tarjan算法定义了两个数组:
depth[]
和low[]
,定义如下:
depth[i]
:节点i在DFS-tree上的深度。low[i]
:在dfs-tree上,以节点i及其子孙为起点的回边回到的 最低 高度。
假设我们已经算出每个节点的depth
(下简称dep
)和low
,如何判断割边呢?
(务必注意,dep
和low
越大意味着越晚被遍历)
分类讨论一下吧:(假设目前在处理tree2上u->v边)
low[v]<=dep[u]low[v]<=dep[u]low[v]<=dep[u]:意味着v(下方点)能回到u(上)及u以上的点,此时拿掉u-v,仍有至少1条路径使v能回溯到上面,不会断开,故不是桥。
low[v]>dep[u]low[v]>dep[u]low[v]>dep[u]:意味着v只能回到u以下,此时若拿掉u-v,u、v间回断开,故是桥。
(很久以前的笔记)
至此,我们已经明确割边的判断,最后一件事便是求low
值 了:
- 未访问过的点(树边):那么这是原节点的子孙,只需在dfs改点后将二者low取min(因为存在下方没有树边的情况此时不需更新low)
- 已访问的点(回边):(边u->v)取low[u]=min(low[u],dep[v]),注意回边终点用dep而非low,因为low去的时候回到的最早,不能二次回边。
2.1、求割边并输出
//vector<> g存图
int d=0;//深度从0开始
void dfs(int u){vis[u]=1;dep[u]=low[u]=d++;for(int i=0;i<g[u].size();++i){int& v=g[u][i];if(!vis[u]){//树边dfs(v);low[u]=min(low[u],low[v]);//更新 low[]值//仅在是树边时判断if(low[u]>dep[v]) printf("%d-%d\n",u,v);}else{//回边low[u]=min(low[u],dep[v]);}}
}
2.2、求连通分量
//求图的连通分量int st[N],tp=0;//栈
int cn;//分量数量
int d=0;
void dfs(int u){vis[u]=1;dep[u]=low[u]=d++;st[tp++]=u;//入栈for(int i=0;i<g[u].size();++i){int& v=g[u][i];if(!vis[u]){dfs(v);low[u]=min(low[u],low[v]);if(low[u]>dep[v]){printf("第%d个连通分量:",++cn);int t;do{t=st[tp--];printf("%d ",t);}while(t!=u);printf("\n");}}else{low[u]=min(low[u],dep[v]);}}return;
}
#if 0
算法实现:若u->v是桥,则当前栈出到v(v出)。
#endif
顺带一提,边-2-连通图 指至少删掉2条边才不连通(即无桥)。
-----THE END-----
THANK YOU !
证明:
因为是无向图,所以dfstree上的有向边在原图上无向,那么dfstree底图上回边形成的环在原图也是成立的,那么对于环上的任意u,v,都至少有2条路径互通,拿掉一条后至少剩一条,所以回边不是桥。
如图: ↩︎即DFS-tree,下同。 ↩︎
C++算法篇:DFS超详细解析(2)--- tarjan算法求无向图割边相关推荐
- C++算法篇:DFS超详细解析(1)--- 无向图基本概念
系列文章目录 ①:无向图基本概念 ②:tarjan算法求无向图割边 文章目录 系列文章目录 一.DFS是什么? 二.DFS的基本框架 三.DFS-tree 四.图的基本知识 一.DFS是什么? ...
- 超详细解析 | 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:r6d.cn/VMW9 背景 在常见的分布式系统中, ...
- Android技能树 — 网络小结(6)之 OkHttp超超超超超超超详细解析
前言: 本文也做了一次标题党,哈哈,其实写的还是很水,各位原谅我O(∩_∩)O. 介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看 ...
- 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析
2019/07/13 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析 发表日期:2019/07/13 单片机开发板:巫妖王2.0, 使用同款开发板可直接上板测试 文档说明: 实现功能 : 一 ...
- 计算机网络之交换机的工作原理---超详细解析,谁都看得懂!!
在了解交换机的工作原理之前,我们先要了解几个概念. 一.相关概念 1.OSI七层模型是哪七层? 自上而下分别是: 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 交换机工作在数据链路层, ...
- 数字信号处理(DTFT与DFT、DFS的详细讲解以及FFT算法)
DTFT与DFT.DFS的详细讲解以及FFT算法 DTFT与DFT.DFS的区别在哪里呢? 离散傅里叶级数DFS 离散傅里叶变换DFT 有限长序列的线性卷积和循环卷积 利用DFT做连续信号的频谱分析 ...
- 点云处理算法整理(超详细教程)
点云处理算法整理(超详细教程) 目录 一. 线性回归_最小二乘法.梯度下降法 二. 线性回归_最小二乘法.RANSAC算法 三. 最近点迭代_ICP算法 四. 常见三角网格划分_voronoi图和De ...
- 【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解...
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 算法起源 粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由E ...
- 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR超详细解析
背景 在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟.丢失.重复.乱序,还有网络分区)等情况. 一致性算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地 ...
最新文章
- Scala入门到精通——第二十九节 Scala数据库编程
- CVPR 2020 HAN:《Hypergraph Attention Networks for Multimodal Learning》论文笔记
- jQuery基本语法
- Qt学习笔记-使用shape() 使得碰撞更加精确
- (23)FPGA锁存器与缓冲器的区别
- java 解析 svg_如何解析Java / Android中的SVG?
- k均值算法原理及matlab实现
- python 类继承
- cdr 表格自动填充文字_常平办公软件培训分享之word表格自动填充序号
- 2008年高考数学江西卷压轴题
- 第1章思维导图图片版
- 呕心沥血踩坑之:外星人M17电脑在一块硬盘上成功安装Windows与Ubuntu16.04双系统
- 云中和花木_王者荣耀:体验服4位英雄加强,狂铁不再“漏电”,云中君又行了...
- 解决html页面图片大小不能自适应的问题
- carsim与simulink联合仿真-ABS(制动防抱死系统) 入门——详细步骤
- 巨人10Q4财报:营收3.6亿元环比增8.7%
- java.lang.String cannot be cast to com.rock.bpo.agent.base.LoginUser
- 图文详解 Windows 2003服务器集群安装(5)(完)
- pdf转换成word转换器在线哪个最好
- linux串口读取 GPS模块程序
热门文章
- c++ 字符串匹配算法Robin-Karp算法
- 5码默认版块_短说社区论坛系统版块权限功能
- 2021高考汇文中学成绩查询,2021年北京高考英语阅读理解评析(北京汇文中学)...
- FTP 设置用户名和密码
- Excel 2010 SQL应用097 聚合函数之方差或标准方差
- 浙江省2013计算机教师招聘试题,2013年浙江省教师招聘考试真题(教育基础知识)省统考中学...
- 我的一年AI算法工程师成长记
- 电子计算机制作探测,金属探测器DIY,你真正了解过多少?
- 大龄程序员求职四处碰壁,不知今后该怎么办!网友:老码农有咩用
- Qt快捷键之大小写切换