强连通分量(SCC, Strongly Connected Components)

news2024/11/25 0:43:56

强连通分量(SCC, Strongly Connected Component)

  • 强连通分量的概念
  • 强连通分量的应用
  • 强连通分量的算法——Tarjan算法

强连通分量的概念

在有向图中,任意两个顶点 v i v_i vi v j v_j vj 互相可达(也即存在路径 v i → v j v_i \rightarrow v_j vivj 和路径 v j → v i v_j \rightarrow v_i vjvi),则称这些顶点构成连通分量

强连通分量(SCC, Strongly Connected Component),即极大连通分量,对于一个联通分量,如果每个包含它的极大联通分量就是其本身,则称为极大联通分量。或者说强连通分量只要增加一个顶点,则无法构成连通分量。
在这里插入图片描述
例如在上图中,BCDE构成强连通分量,而CD则不是强连通分量。

强连通分量的应用

将有向图中的强连通分量缩成一个顶点,有向图则成为一个有向五环图(DAG),而DAG也称为拓扑图,其顶点可以进行拓扑排序。

在这里插入图片描述
而拓扑图在图论中可以用于求解最短/长路径。拓扑图在优化编译器中也有重要应用。

强连通分量的算法——Tarjan算法

比较典型的算法是Tarjan算法,该算法时间复杂度为 O(V+E)。下面介绍下该算法原理,参考了youtube一位大佬的视频。

Tarjan算法主体采用DFS遍历,每访问一个顶点,给该顶点赋值一个id和low-link,low-link表示当前顶点能到达的顶点中最小的id(包括它自己的id)。
在这里插入图片描述
可见low-link相同的节点就组成强联通分量。该算法核心就是计算每个节点low-link值。

该算法需要维护一个栈,防止跨Sccs跟新low-link,也就是说在有效的顶点范围内更新low-link。
在这里插入图片描述
DFS访问一个未访问的顶点即加入栈中作为有效顶点,当找到一个Scc时,将这些顶点从栈中弹出。

low-link的更新条件为:使用节点v的low-link更新顶点u的low-link,必须有一个从u到v的边,并且顶点v必须在栈中。

Tarjan算法概览:

  • 标记所有节点为未访问状态(unvisited)。
  • 开始DFS,访问节点,并为其分配id和low-link值,标记该顶点已经访问过(visited),并加入到栈中。
  • 当DFS回溯时,如果先前节点在栈中,则使用当前顶点的前一个顶点来更新当前顶点的low-link(取二者最小值)。
  • 在完成当前顶点的所有邻居后,如果以当前顶点为起始的顶点组成Sccs,则将栈中的顶点弹出,直到当前顶点。

例如:
在这里插入图片描述
任意选择顶点开始DFS,这里选择的是顶点0,依次将顶点0、1、2入栈,当顶点2继续DFS时,发现顶点0已经访问过了,于是开始回溯,并更新计算low-link值。当回溯到顶点0时,其id值等于low-link值,说明找到了一个Scc,此时将相关顶点弹出。

然后再选择一个顶点继续DFS,这里选择顶点3。
在这里插入图片描述
将顶点3、4、5依次入栈,从顶点5继续DFS,访问顶点0,顶点已经访问过了,则回溯到顶点5,此时不更新low-link,因为顶点0不在栈中。接着继续DFS到顶点6和4,将顶点6和4入栈(顶点2和顶点0的情况一样),顶点4已经访问过了,开始回溯,并更新low-link值。当回溯到顶点4时,其id值和low-link值相等,找到一个Scc,依次将顶点6、5、4弹出。

在这里插入图片描述
此时栈中还剩顶点3,继续DFS到顶点4,节点4已经访问过了,回溯到顶点3,顶点4不在栈中,不更新顶点3的low-link。此时虽然顶点3的id和low-link相等,但顶点3的邻居还没访问完,继续DFS到顶点7。
在这里插入图片描述
同样地,找到一个新的Scc。

最后,给出完整的为伪代码:
在这里插入图片描述在这里插入图片描述

参考:

  • https://www.youtube.com/watch?v=wUgWX0nc4NY
  • https://github.com/williamfiset/Algorithms

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

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

相关文章

chatgpt赋能python:Python如何连接数据库?

Python如何连接数据库? Python作为一种高级编程语言,已经被广泛应用于数据科学和Web开发。连接数据库是Python的一项重要功能,可以使我们的代码访问各种数据源来收集、分析和存储数据。在这篇文章中,我们将介绍Python如何连接各种…

chatgpt赋能python:Python循环等待用户输入:提高交互性和可靠性

Python 循环等待用户输入:提高交互性和可靠性 作为一种高级编程语言,Python 可以通过很多方式实现与用户进行交互,其中最基础的方式是等待用户输入。在开发基于文本界面的应用程序、命令行工具或脚本时,这种输入等待机制可以提高…

JDK8 新特性 Stream API 进阶 (结合案例详解--通透--讲清)

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 …

ruoyi-vue版本(十八)创建自己的项目,使用若依里面的技术,多数据源的实现

目录 1 创建自己的项目2 连接MySQL数据库(多数据源)2.1 若依实现多数据源2.1.1 主要思想2.2 第三方的依赖的实现1 创建自己的项目 1 创建一个空文件夹 2 idea 里面创建项目

GPU云服务器Stable Diffusion搭建保姆级教程

搭建Stable Diffusion最大门槛就是GPU。许多人的电脑配置太低,根本无法搭建。或者即使搭建出来,但是跑图太慢。说多了不通过,看下图。 选择服务器 我选择的是境外GPU服务器,windows版本(73.59元)。linux会…

SQL进阶教程读后总结与感想

1. 基本信息 SQL进阶教程 [日]MICK 人民邮电出版社,2017年11月出版,1版 1.1. 读薄率 书籍总字数455千字,笔记总字数25820字。 读薄率25820455000≈5.67% 1.2. 读厚方向 SQL权威指南(第4版) SQL解惑(第2版&…

数据库数据量大了怎么办? 当然是分库分表,Sharding-JDBC了解一下?

Sharding-JDBC是一款基于JDBC规范的分布式数据库中间件,可以帮助Java应用轻松实现水平分库分表、读写分离等分布式数据库功能,并提供了方便易用、高可用、高性能的数据访问解决方案。本文将从以下几个方面进行详细介绍: Sharding-JDBC的原理…

chatgpt赋能python:Python录屏录音介绍

Python录屏录音介绍 在日常工作和学习中,录制屏幕和录制音频是一件很常见的事情。Python语言拥有强大的生态系统和第三方库支持,也可以轻松实现录制屏幕和录制音频的功能。本篇文章将介绍如何使用Python语言实现录屏录音功能。 Python录屏 录制屏幕可…

numpy包中的取余函数和取模函数numpy.remainder()numpy.mod()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 numpy包中的取余函数和取模函数 numpy.remainder() numpy.mod() 下列代码中np.remainder(m,2)输出的结果是? import numpy as np m np.array([4, 5, 6]) print("【显示】m &…

chatgpt赋能python:Python局部导入:提升代码效率与性能

Python 局部导入: 提升代码效率与性能 Python 是一种强大的编程语言,为开发者提供了许多工具和库,以简化开发过程。在项目中,对于复杂的代码文件,Python 的模块化设计可以让我们将代码分解为更小的组件,以便更好地维护…

chatgpt赋能python:Python的声音处理能力

#Python的声音处理能力 Python 是一种多功能编程语言,强有力的功能和库使它成为一种广泛使用的工具。Python也可以用于处理声音。在本文中,我们将深入了解Python的声音处理能力,并介绍使用Python处理声音的一些库和工具。 ##声音处理的步骤…

chatgpt赋能python:Python循环等待:什么是它?如何解决?

Python 循环等待:什么是它?如何解决? 在 Python 编程中,循环等待是一种常见的问题。它发生在代码一直等待某个操作的结果,而这个结果却永远不会到来。这种情况会导致程序停顿或挂起,从而影响整个应用程序。…

【 react项目 nginx配置服务 按钮点击可以进入页面,如果刷新页面或者通过链接进入页面会报错】

问题 报错内容: react项目部署之后,按钮点击可以进入页面,如果刷新页面或者通过链接进入页面会报错 分析问题得出结论是: react项目,nginx需要配置重定向 解决方案 nginx部分配置: location / {rewri…

ThingsBoard教程(五四):规则节点解析 Azure IoT Hub Node, RabbitMQ Node

Azure IoT Hub Node Since TB Version 2.5.3 配置 主题 - 获取有关IoT Hub主题的更多信息,请使用以下链接。主机名 - Azure IoT Hub主机名。设备ID - 来自Azure IoT Hub的设备ID。凭据 - Azure IoT Hub连接凭据。可以是共享访问签名或PEM格式证书。Azure IoT Hub支持不同的…

网络分级设计模型的三层架构:接入层、汇聚层、核心层到底有什么说法?

你好,这里是网络技术联盟站。 在现代网络中,为了满足不同规模和需求的组织和企业的通信需求,网络架构通常会划分为多个层次,其中包括接入层、汇聚层和核心层。这些层次在网络组网中扮演着不同的角色和功能。 本文将详细介绍接入层…

红队大杀器 Behinder_v4.0(冰蝎4.0)

Behinder_v4.0 GitHub : https://github.com/rebeyond/Behinder/releases/tag/Behinder_v4.0 修复 1.修复了在zimbra环境下的兼容性问题; 2.修复了在exchange环境下的兼容性问题; 3.修复了Linux环境下打开文件失败的问题; 4.修复了命令执行中…

chatgpt赋能python:Python中局部变量的输出到全局

Python 中局部变量的输出到全局 在 Python 中,变量的作用域分为全局和局部两种。全局变量可以在整个程序中使用,而局部变量只能在其定义的函数或代码块中使用。但是,有时候我们需要在局部作用域中定义的变量在全局作用域中使用,本…

chatgpt赋能python:Python在线聊天:如何用Python构建在线聊天应用

Python 在线聊天:如何用 Python 构建在线聊天应用 Python 是一种广泛使用的编程语言,它的易读性和易用性使得它成为编写各种类型应用程序的首选语言,其中包括构建在线聊天应用。如果您想构建一个在线聊天应用程序,那么 Python 是…

<SQL>《SQL命令(含例句)精心整理版(6)》

《SQL命令(含例句)精心整理版(6)》 18 DB2查询语句18.1 查询数据库大小18.2 查看表占表空间大小18.3 查看正在执行的语句18.4 db2expln 查看执行计划18.5 db2advis 查看优化建议 19 空值19.1 NULL19.2 TRIM 18 DB2查询语句 18.1 …

chatgpt赋能python:Python常用扩展包

Python常用扩展包 Python本身就已经是一门非常强大的编程语言了,但是为了适应不同的应用场景, Python社区开发了许多扩展包。这些包涵盖了从数据科学到Web开发的各个领域,让Python的应用范围更加广泛。 下面我们将介绍一些常用的Python扩展…