python 实现Tarjan 用于在有向图中查找强连通分量的算法

news2024/10/7 1:15:42

Tarjan 用于在有向图中查找强连通分量的算法介绍

Tarjan算法是一种用于在有向图中查找强连通分量的高效算法,由Robert Tarjan在1972年提出。强连通分量是指在有向图中,如果从顶点u到顶点v以及从顶点v到顶点u都存在一条路径,那么顶点u和顶点v是强连通的。这些顶点组成的集合被称为强连通分量(Strongly Connected Component,简称SCC)。

Tarjan算法的核心思想是通过深度优先搜索(DFS)遍历图,并使用堆栈来追踪搜索过程中的顶点。在遍历的过程中,对每个顶点进行标记,记录其在搜索树中的深度和最小后向边的深度。如果发现某个顶点的后继节点指向了一个已经被访问过的顶点,并且这个顶点在当前的DFS搜索树中(即它还在栈中),那么这个顶点及其所有后继节点(在栈中且未被处理为其他强连通分量的部分)构成一个强连通分量。

Tarjan算法中最重要的两个数组是low[maxn]和dfn[maxn]:

low[u]代表u可以到达的深度最低的节点的深度值,即u能追溯到的最早被访问到的节点的时间戳。
dfn[u]代表u在DFS树中的深度,即u被访问时的时间戳。

算法的基本步骤如下:

初始化所有顶点的dfn和low值为未定义(通常可以设为无穷大或特定标记)。
对每个未访问的顶点v,进行DFS遍历。
将v标记为已访问,并将其dfn[v]和low[v]设置为当前时间戳。
将v压入栈中。
遍历v的所有邻接点w。
如果w未访问过,则递归地对w进行DFS,并在返回后更新low[v]为min(low[v], low[w])。
如果w已访问过且在栈中(即w是v的后继节点且尚未被处理为其他强连通分量的部分),则更新low[v]为min(low[v], dfn[w])。
如果dfn[v] == low[v],则栈中从v到栈顶的所有顶点构成一个强连通分量,将它们弹出栈并标记为同一个强连通分量。

Tarjan算法的时间复杂度为O(V + E),其中V表示图中的顶点数,E表示图中的边数。由于只需要一次DFS遍历即可找到所有的强连通分量,因此Tarjan算法是一种高效的强连通分量查找算法。

以上是对Tarjan算法用于在有向图中查找强连通分量的简要介绍。如需更详细的信息或示例代码,请参考相关算法书籍或在线资源。

Tarjan 用于在有向图中查找强连通分量的算法python实现样例

以下是Python中实现Tarjan算法查找强连通分量的示例代码:

class Tarjan:
    def __init__(self, graph):
        self.graph = graph
        self.num_nodes = len(graph)
        self.index = 0
        self.lowlink = [0] * self.num_nodes
        self.on_stack = [False] * self.num_nodes
        self.stack = []
        self.scc = []

    def tarjan_scc(self):
        for i in range(self.num_nodes):
            if self.lowlink[i] == 0:
                self.strong_connect(i)
        return self.scc

    def strong_connect(self, v):
        self.index += 1
        self.lowlink[v] = self.index
        self.stack.append(v)
        self.on_stack[v] = True

        for w in self.graph[v]:
            if self.lowlink[w] == 0:
                self.strong_connect(w)
                self.lowlink[v] = min(self.lowlink[v], self.lowlink[w])
            elif self.on_stack[w]:
                self.lowlink[v] = min(self.lowlink[v], self.lowlink[w])

        if self.lowlink[v] == self.index:
            scc_component = []
            while True:
                w = self.stack.pop()
                self.on_stack[w] = False
                scc_component.append(w)
                if w == v:
                    break
            self.scc.append(scc_component)

使用示例:

# 创建有向图的邻接表表示
graph = [
    [1],
    [2],
    [0, 3],
    [4],
    [5],
    [3]
]

# 创建Tarjan对象
tarjan = Tarjan(graph)

# 调用tarjan_scc方法查找强连通分量
scc = tarjan.tarjan_scc()

# 输出强连通分量
for component in scc:
    print(component)

输出结果:

[0, 1, 2]
[3]
[4, 5]

以上代码实现了Tarjan算法用于在有向图中查找强连通分量。算法首先初始化相关数据结构,包括索引、低链接、栈等。然后按照Tarjan算法的步骤进行深度优先搜索,并在搜索过程中记录每个节点的索引和低链接值。当找到一个强连通分量时,从栈中弹出节点,直到找到当前节点为止,并将这些节点组成一个强连通分量。最终,算法返回所有的强连通分量。

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

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

相关文章

二分查找算法——山脉数组的峰顶索引&寻找峰值

1.题目解析 题目来源:852.山脉数组的峰顶索引 测试用例 题目来源:162.寻找峰值 测试用例 2.算法原理 山脉数组的峰顶索引 根据二段性将山脉数组分为两段:上升段与下降段 1.当mid指针落入上升段,说明峰值在mid指针后,要…

Linux 系统五种帮助命令的使用

Linux 系统五种帮助命令的使用 本文将介绍 Linux 系统中常用的帮助命令,包括 man、–help、whatis、apropos 和 info 命令。这些命令对于新手和有经验的用户来说,都是查找命令信息、理解命令功能的有力工具。 文章目录 Linux 系统五种帮助命令的使用一…

19年408数据结构

第一题&#xff1a; 解析&#xff1a; 设程序执行了K次&#xff0c;则有x K&#xff0c;n<k^2,解得nn^(1/2) 答案选B。 第二题&#xff1a; 解析&#xff1a;这道题直接当作一个结论来记&#xff0c;因为已经出现过很多次了&#xff1a;树的后根遍历和对应二叉树的中序遍…

【异常记录Vue_20241006】使用TagsView后控制台报错

报错截图 报错原因 未将TagsView所依赖的组件permission组件注册到store中&#xff0c;导致TagsView组件在找permission.routes时没找到 解决方法&#xff1a;store注册相应组件

Linux:进程入门(进程与程序的区别,进程的标识符,fork函数创建多进程)

往期文章&#xff1a;《Linux&#xff1a;深入了解冯诺依曼结构与操作系统》 Linux&#xff1a;深入理解冯诺依曼结构与操作系统-CSDN博客 目录 1. 概念 2. 描述进程 3. 深入理解进程的本质 4. 进程PID 4.1 指令获取PID 4.2 geipid函数获取PID 4.3 kill指令终止进程 …

计算机毕业设计 校内跑腿业务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

从零开始构建大型语言模型——实现注意力机制

本章内容&#xff1a; 使用注意力机制的原因基本的自注意力框架&#xff0c;逐步深入到增强的自注意力机制允许LLMs逐个生成词元的因果注意力模块通过dropout随机屏蔽部分注意力权重以减少过拟合将多个因果注意力模块堆叠为多头注意力模块 到目前为止&#xff0c;你已经了解了…

【GeekBand】C++设计模式笔记6_Decorator_装饰模式

1. “单一职责”模式 在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随着需求的变化&#xff0c;子类急剧膨胀&#xff0c;同时充斥着重复代码&#xff0c;这时候的关键是划清责任。典型模式 DecoratorBridge 2. Decorator 装饰模…

Android 内存优化:什么原因导致内存问题?通过内存工具进行分析;内存抖动和内存泄漏;MAT的使用;Profiler的使用;如何优化?

目录 一、为什么要进行内存优化呢&#xff1f; 我们开发一个App程序&#xff0c;如果不了解内存的使用情况&#xff0c;就是将稳定性弃之不管。因为你不知道他在什么时候会发生OOM问题&#xff0c;不知道为什么程序会卡顿&#xff0c;不知道为什么会发生问题。你也没有自信跟别…

算法题之香槟塔

香槟塔 我们把玻璃杯摆成金字塔的形状&#xff0c;其中 第一层 有 1 个玻璃杯&#xff0c; 第二层 有 2 个&#xff0c;依次类推到第 100 层&#xff0c;每个玻璃杯将盛有香槟。 从顶层的第一个玻璃杯开始倾倒一些香槟&#xff0c;当顶层的杯子满了&#xff0c;任何溢出的香槟…

【TypeScript】知识点梳理(三)

#void前面提到了代表空&#xff0c;但有个特殊情况&#xff0c;是空不是空&#xff0c;细谈是取舍&#xff0c;但我们不深究hhh# 代码示例&#xff1a; type func () > voidconst f1: func function() {return true; } 定义了空&#xff0c;返回非空值&#xff0c;理论…

Windows搭建RTMP服务器

这里写自定义目录标题 1 Nginx-RTMP服务器搭建1.1 下载Nginx1.2 下载Nginx的RTMP扩展包1.3 配置Nginx1.4 启动Nginx1.5 查看Nginx状态 2 FFmpeg推流2.1 下载FFmpeg2.2 配置FFmpeg环境变量2.3 验证FFmpeg配置 3 视频推流3.1 OBS推流3.2 FFmpeg推流 4 VLC拉流4.1 VLC4.2 打开网络…

vue3+PPTXjs 在线ppt预览

- 使用PPTXjs做ppt预览&#xff0c;有完整的代码包&#xff0c;基于jquery - vue3使用iframe引入用于预览ppt的网页&#xff0c;通过url参数传递需要预览的ppt链接 - 通过网页选择文件上传也可以通过下面的函数把文件转换成链接&#xff0c;实现在文件上传到服务器前就可以预…

【深度强化学习】DDPG实现的4个细节(OUNoise等)

文章目录 前言一、论文内容简述创新点&#xff08;特点&#xff0c;与DQN的区别&#xff09;&#xff1a;可借鉴参数&#xff1a;细节补充&#xff1a; 二、细节1&#xff1a;weight_decay原理代码 三、细节2&#xff1a;OUNoise原理代码 四、细节3&#xff1a;ObsNorm原理代码…

PostgreSQL分区表,实战细节满满

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

茄子病虫害数据集。四类:果肉腐烂、蛀虫、健康、黄斑病。4000张图片,已经按照8:2的比例划分好训练集、验证集 txt格式 含类别yaml文件 已经标注好

茄子病虫害数据集。可用于筛选茄子品质、质量&#xff0c;训练采摘机器人视觉算法模型……数据集大部分图片来源于真实果园拍摄的图片&#xff08;生长在果树之上的&#xff09;&#xff0c;图片分辨率高&#xff0c;数据集分为四类&#xff1a;果肉腐烂、蛀虫、健康、黄斑病。…

如何使用ssm实现基于Java的民宿预订管理系统的设计与实现

TOC ssm773基于Java的民宿预订管理系统的设计与实现jsp 绪论 1.1课题研究背景意义 随着科技的发展&#xff0c;计算机的应用&#xff0c;人们的生活方方面面都和互联网密不可分。计算机的普及使得人们的生活更加方便快捷&#xff0c;网络也遍及到我们生活的每个角落&#x…

Vue - 打包部署

vscode找到NPM脚本&#xff0c;点击build。 目录下出现dist目录则表示安装成功。 安装Nginxnginx: download 目录用途conf配置文件目录html静态资源文件目录logs日志文件目录temp临时文件目录 将刚刚打包好的文件放到html目录下。 点击nginx.exe&#xff0c;用localhost:默认…

Windows应急响应-QQ巨盗病毒

文章目录 病毒背景样本分析开启监控感染病毒分析病毒行为C盘文件监控D盘文件监控进程监控排查服务排查启动项排查 查杀1.杀掉进程2.异常服务3.映像劫持处理4.hosts文件处理5.D盘文件删除6.其他异常排查 重启排查 病毒背景 简介&#xff1a;Win32.PSWTroj.QQPass&#xff0c;名…

模拟退火算法简介

什么是模拟退火算法&#xff1f; 模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09;是一种基于随机化搜索的优化算法&#xff0c;灵感来源于金属退火过程。在金属制造中&#xff0c;金属被加热到高温并缓慢冷却&#xff0c;这一过程可以减少内部缺陷&am…