【图论】Tarjan算法(强连通分量)

一、Tarjan算法简介

Tarjan算法是一种由美国计算机科学家罗伯特·塔杨(Robert Tarjan)提出的求解有向图强连通分量的线性时间的算法。

二、强连通分量的概念

在有向图 G G G 中,如果任意两个不同的顶点相互可达,则称该有向图是强连通的。
如图1所示,图“郓城武安张”就是一个强连通图。
图1
图1

如果在强连通图 G G G 中进行加边操作得到有向图 G ′ G' G,那么我们称原图 G G G G ′ G' G 的一个强连通分量。
如图2所示,图“郓城武安张”、图“同”和图“学”都是图“郓城武安张同学”的一个强连通分量。
图2
图2

三、初识Tarjan算法

Tarjan算法本质上是基于深度优先搜索的一种算法。
在使用Tarjan算法时,需要用到两个辅助数组:
d n f x dnf_x dnfx:记录每个点被发现时的时刻。
l o w x low_x lowx:表示以顶点x为根的子树中所有顶连出的边能到达的最早的能到达x的顶。
通俗一点,对于图2中的图,为了应对汉字无法作为下标的问题,我们简化一下,得到下面的图3。
图3
图3

假定 1 1 1 号结点为搜索起点,那么我们将有:

  • d n f i = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } dnf_i=\{1,2,3,4,5,6,7\} dnfi={1,2,3,4,5,6,7}
  • l o w i = { 1 , 1 , 1 , 1 , 1 , 6 , 7 } low_i=\{1,1,1,1,1,6,7\} lowi={1,1,1,1,1,6,7}

如果对上面的描述有疑惑,请往下看。

四、模拟Tarjan算法

我们继续看上面的图3,并对它进行模拟(假定 1 1 1 号结点为搜索起点),深入地了解Tarjan算法。
为了帮助理解,求图3中的有向图以 1 1 1 号结点为根的最小生成树,如图4。
图4
图4

会发现,这棵树是一条链的结构。

  1. 初始化: d n f i = 0 dnf_i=0 dnfi=0,对于每一步, l o w i = d n f i low_i=dnf_i lowi=dnfi
  2. 1 1 1 号结点进入程序,并将其入栈,将 d n f 1 dnf_1 dnf1 的值赋为 1 1 1
    栈: 1 1 1
  3. 1 1 1 号结点可以直接到达 2 2 2 号结点,且 d n f 2 = 0 dnf_2=0 dnf2=0,将 2 2 2 号结点入栈,并将将 d n f 2 dnf_2 dnf2 的值赋为 2 2 2
    栈: 1 2 1~2 1 2
  4. 2 2 2 号结点可以直接到达 3 3 3 号结点,且 d n f 3 = 0 dnf_3=0 dnf3=0,将 3 3 3 号结点入栈,并将将 d n f 3 dnf_3 dnf3 的值赋为 3 3 3
    栈: 1 2 3 1~2~3 1 2 3
  5. 3 3 3 号结点可以直接到达 4 4 4 号结点,且 d n f 4 = 0 dnf_4=0 dnf4=0,将 4 4 4 号结点入栈,并将将 d n f 4 dnf_4 dnf4 的值赋为 4 4 4
    栈: 1 2 3 4 1~2~3~4 1 2 3 4
  6. 4 4 4 号结点可以直接到达 5 5 5 号结点,且 d n f 5 = 0 dnf_5=0 dnf5=0,将 5 5 5 号结点入栈,并将将 d n f 5 dnf_5 dnf5 的值赋为 5 5 5;(注意啦,下一步是重点!)
    栈: 1 2 3 4 5 1~2~3~4~5 1 2 3 4 5
  7. 5 5 5 号结点可以直接到达 1 1 1 号和 6 6 6 号两个结点,按字典序先遍历 1 1 1 号结点,因为 d n f 1 = 1 ≠ 0 dnf_1=1\neq0 dnf1=1=0,此时我们需要进行出栈操作;
    栈: 1 2 3 4 5 1~2~3~4~5 1 2 3 4 5
  8. 将栈顶 l o w 5 low_5 low5 的值赋值为 min ⁡ ( l o w 5 , d n f 1 ) = 1 \min(low_5,dnf_1)=1 min(low5,dnf1)=1,并将 5 5 5 出栈,将栈顶 l o w 4 low_4 low4 的值赋值为 min ⁡ ( l o w 4 , d n f 5 ) = 1 \min(low_4,dnf_5)=1 min(low4,dnf5)=1,并将 4 4 4 出栈;
  9. 依此类推,直至 1 1 1 被出栈;
    栈:空
  10. 5 5 5 号结点继续往下搜索, 5 5 5 号结点可以直接到达 6 6 6 号结点,且 d n f 6 = 0 dnf_6=0 dnf6=0,将 6 6 6 号结点入栈,并将将 d n f 6 dnf_6 dnf6 的值赋为 6 6 6
    栈: 6 6 6
  11. 6 6 6 号结点可以直接到达 7 7 7 号结点,且 d n f 7 = 0 dnf_7=0 dnf7=0,将 7 7 7 号结点入栈,并将将 d n f 7 dnf_7 dnf7 的值赋为 7 7 7
    栈: 6 7 6~7 6 7
  12. 7 7 7 号结点没有可以直接到达的结点,回溯(回溯过程省略);
    栈: 6 7 6~7 6 7
  13. 此时,整个图都已经被搜索完毕,但是栈中仍存在原神元素,说明栈中剩余的每个结点都自成一个强连通分量,我们只需依次出栈即可。
    栈:空
  14. 最终得到第三部分所提及的两个数组。

代码:

int step;
stack<int>st;
int dnf[300006],low[300006];
bool in_st[300006];
void tarjan(int x){int tmp;step++;dnf[x]=low[x]=step;st.push(u);in_st[x]=1;for(int i=head[x];i!=-1;i=nxt[i]){tmp=e[i];if(!dnf[tmp]){tarjan(tmp);low[x]=min(low[x],low[tmp]);}else if(in_st[tmp])low[x]=min(low[x],dnf[tmp]);}if(low[x]==dnf[x]){do{tmp=st.top();st.pop();in_st[tmp]=0;}while(tmp!=x);}return;
}

如果博客有错误,请联系我,我会尽快修正!压力马斯内!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/52567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android高级UI --- canvas

前言 我们先来聊聊&#xff0c;在我们生活中如何绘制一张如下的图。 我们需要两样东西来绘制&#xff1a; 一张纸&#xff08;Android 中的 canvas&#xff09;&#xff1a;用来承载我们绘制的内容。一支笔&#xff08;Android 中的 paint&#xff09;&#xff1a;负责绘制内…

(QT-UI)十四、在时间轴上绘制一段段时间片

本系列预计实现 ①刻度上方文字显示&#xff0c; ②时间轴拖动效果&#xff0c; ③时间轴刻度缩放&#xff0c; ④时间轴和其他控件联动显示&#xff0c; ⑤鼠标放置到时间轴&#xff0c;显示具体时间。 ⑥通过定时器&#xff0c;实时更新时间轴 ⑦时间轴上绘制时间片 完…

linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

重发布实验

一、实验拓扑 二、实验需求 1.如图搭建网络拓扑&#xff0c;所有路由器各自创建一个环回接 口&#xff0c;合理规划IP地址 2.R1-R2-R3-R4-R6之间使用OSPF协议&#xff0c;R4-R5-R6之间使用 RIP协议 3.R1环回重发布方式引入OSPF网络 4.R4/R6上进行双点双向重发布 5.分析网络中出…

VScode | 我想推荐这些插件,好用

系列文章目录 本系列文章主要分享作位前端开发的工具之------VScode的使用分享。 VScode | 我的常用插件分享_vscode 别名跳转-CSDN博客 VScode | 我的常用代码片段&#xff0c;提升开发速度-CSDN博客 VScode | 我会设置文件夹右键用VScode打开_vscode右键打开文件夹-CSDN博…

如何使用ssm实现基于ssm的“游侠”旅游信息管理系统

TOC ssm190基于ssm的“游侠”旅游信息管理系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#x…

RocketMQ~刷盘机制、主从复制方式、存储机制

刷盘机制 生产者发布MQ给Brocker&#xff0c;Brocker在存储这些数据的时候&#xff0c;需要进行刷盘&#xff0c;分为同步刷盘和异步刷盘。 在同步刷盘中需要等待一个刷盘成功的ACK&#xff0c;同步刷盘对MQ消息可靠性来说是一种不错的保障&#xff0c;但是性能上会有较大影响…

GoWeb 设置别名和多环境配置

别名 vite.config.ts中添加代码如下即可 //设置别名resolve: {alias: {"": path.resolve(process.cwd(),"src"),//用替代src}}随后即可使用 配置多环境 vite.config.ts中添加代码如下 envDir: ./viteenv,//相对路径随后在项目根目录创建对应的viteenv…

【游戏速递】 小猪冲刺:萌动指尖的极速挑战,小虎鲸Scratch资源站独家献映!

在线玩&#xff1a;Scratch小猪冲刺&#xff1a;全新挑战的几何冒险游戏-小虎鲸Scratch资源站 想象一下&#xff0c;一群憨态可掬的小猪&#xff0c;穿上炫酷的装备&#xff0c;踏上了追逐梦想的赛道。它们或跳跃、或滑行&#xff0c;灵活躲避各种障碍&#xff0c;只为那终点的…

Web API 学习笔记 第四弹

1.时间戳 获取时间戳的方法①date.getTime()②new Date() 2.定时器 console.log(111)setTimeout(()>{console.log(222)},1000)console.log(333) console.log(111)setTimeout(()>{console.log(222)},0)console.log(333) 这两段代码打印结果分别是&#xff1f; 第一段 …

【STM32】驱动OLED屏

其实我没买OLED屏哈哈哈&#xff0c;这个只是学习了&#xff0c;没机会实践。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 显示原理 2 读写方式&#xff1a;8080并口 2.1 支持的指令类型 2.2 …

【Tesla FSD V12的前世今生】从模块化设计到端到端自动驾驶技术的跃迁

自动驾驶技术的发展一直是全球汽车行业的焦点&#xff0c;Tesla的Full-Self Driving&#xff08;FSD&#xff09;系统凭借其持续的技术革新和强大的数据支持&#xff0c;在这个领域独占鳌头。本文将深入介绍Tesla FSD V12的演进历史&#xff0c;从自动驾驶的基础概念入手&#…

数据结构-时间、空间复杂度-详解

数据结构-时间复杂度-详解 1.前言1.1数据结构与算法1.2如何衡量一个算法的好坏1.3复杂度 2.时间复杂度2.1是什么2.2大O符号只保留最高阶项不带系数常数次为O(1) 2.3示例示例2.1示例2.2示例2.3示例2.4 2.4题目 3.空间复杂度3.1是什么3.2大O符号3.3示例示例1示例2示例3示例4 4.题…

2024-08-26 更改驱动器号导致的软件崩溃问题

​ 在给电脑重新分盘时&#xff0c;想把 Software 盘的驱动器号&#xff08;E:&#xff09;改为对应的首字母 S&#xff0c;因此导致了所有软件崩溃。主要原因是软件主要依据驱动器号识别位置&#xff0c;而更改驱动器号后&#xff0c;并不会将软件设置的驱动器号一并更改。 ​…

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

车载通信框架--- 以太网重连Port口相关思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

手机mkv转换mp4:轻松实现视频格式兼容

如今手机已成为我们日常生活中不可或缺的伴侣&#xff0c;而视频文件则是我们享受娱乐、获取信息的重要来源。然而&#xff0c;由于不同设备和平台对视频格式的支持各有不同&#xff0c;我们有时会遇到无法在手机上播放某些视频文件的问题。 mkv是一种常见的视频格式&#xff…

java接口 controller层接收list集合传参,postman 调用接口时required parameter XXX is not present

开发过程中开发一个java接口 controller层接收list集合传参&#xff0c;然后postman调用一直不成功&#xff0c;报错 使用RequestParam方式&#xff0c;如果postman 调用接口时报错required parameter XXX is not present 可能是&#xff08;value“items”&#xff09;跟你输…

A Neural Probabilistic Language Model

摘要 统计语言建模的一个目标是学习单词序列的联合概率函数。由于维度的诅咒&#xff0c;这在本质上是困难的:我们建议用它自己的武器来对抗它。在提出的方法中&#xff0c;人们同时学习(1)每个单词的分布式表示&#xff08;词向量&#xff09;(即单词之间的相似性)以及(2)表示…

在进行网站链接时,‌加上http或https的重要性不言而喻

这一简单的操作背后&#xff0c;‌蕴含着对搜索引擎优化&#xff08;‌SEO&#xff09;‌的深刻理解&#xff0c;‌以及对网站权重提升的精准把握。‌以下&#xff0c;‌我们将深入探讨这一话题&#xff0c;‌以期为您的网站优化提供有价值的参考。‌优化&#xff08;‌SEO&…