Tarjan算法求割点的正确使用前提与边序无关性解析

冬磊姑娘_8730

冬磊姑娘_8730

2026-09-07

277人浏览

原创

Tarjan算法求割点的正确使用前提与边序无关性解析

本文澄清一个常见误解:Tarjan割点算法在无向图中结果与边的添加顺序无关;若出现不同输出,根本原因在于图结构被错误建模(如未对称添加无向边),导致实际输入并非同一无向图。

本文澄清一个常见误解:tarjan割点算法在**无向图中结果与边的添加顺序无关**;若出现不同输出,根本原因在于图结构被错误建模(如未对称添加无向边),导致实际输入并非同一无向图。

Tarjan算法用于识别无向图中的割点(Articulation Points)——即删除后使连通分量数量增加的顶点。该算法基于深度优先搜索(DFS),依赖两个核心数组:disc[](发现时间戳)和low[](通过至多一条回边可达的最早祖先时间戳)。其正确性严格建立在图的无向性之上:每条无向边 (u, v) 必须在邻接表中双向表示为 u → v 和 v → u。

然而,在您提供的 Java 示例中,邻接表构建存在严重缺陷:所有边仅单向添加。例如,adj1.get(0).add(2) 仅添加了 0→2,但未添加 2→0;同理,adj1.get(2).add(1) 缺少 1→2。这使得程序实际处理的是一个有向图,而非预期的无向图。

由于 Tarjan 割点算法不适用于有向图(标准定义与判定逻辑均针对无向连通性),此时 DFS 遍历路径、回边识别及 low[] 更新均失效。不同边添加顺序会改变 DFS 的起始邻接顺序,进而影响遍历树结构和 low[] 计算,最终导致割点判断结果不一致——这并非算法缺陷,而是输入违规引发的未定义行为。

✅ 正确做法:对每条无向边 (u, v),必须双向插入:

adj.get(u).add(v);
adj.get(v).add(u); // 关键!不可遗漏

以您的 Graph 1 为例,修正后的完整建图应为:

// 无向边 (0,2) → 双向
adj1.get(0).add(2); adj1.get(2).add(0);
// 无向边 (2,1) → 双向
adj1.get(2).add(1); adj1.get(1).add(2);
// 无向边 (0,4) → 双向
adj1.get(0).add(4); adj1.get(4).add(0);
// ... 其余边同理

经此修正,无论边以何种顺序添加,只要图拓扑相同,算法将稳定输出 零个割点——因为该图实际是一个环状嵌套结构(含三角形 0-1-2 和环 0-4-5-6-3-2),属于双连通图(biconnected),不存在割点。

⚠️ 注意事项:

  • 切勿将 Tarjan 割点算法直接用于有向图;有向图需使用强连通分量(SCC)等不同模型。
  • 验证图的无向性:对每个顶点 u,检查 v ∈ adj[u] 是否蕴含 u ∈ adj[v]。
  • 时间戳 TIME 需在每次 AP() 调用前重置为 0(当前代码已正确实现)。
  • 多连通分量图需确保对每个未访问节点启动独立 DFS(当前代码的外层循环已满足)。

总结:算法结果随边序变化,是数据结构未忠实表达无向图语义的明确信号。回归图论本质——无向边的对称性,是正确应用 Tarjan 算法的前提。修复邻接表构建逻辑后,结果将完全确定且符合理论预期。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

4836

4

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

80

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

40

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

20

15

Conan创建软件包配方指南
Conan创建软件包配方指南

本专题介绍通过conanfile.py创建软件包的方法,讲解包名、版本、依赖和构建设置等基础信息,以及source、build、package、package_info等常用方法的作用及编写思路。

2026.09.22

20

12

Conan二进制包配置指南
Conan二进制包配置指南

本专题介绍Conan根据操作系统、编译器、架构和构建类型生成二进制包的方法,讲解Profile、Settings、Options及Package ID的作用,帮助管理不同平台和编译环境下的包版本。

2026.09.22

40

13

Conan私有仓库搭建教程
Conan私有仓库搭建教程

本专题系统的讲解Conan私有仓库的搭建流程,涵盖仓库服务部署、存储目录配置、用户认证、权限划分和远程地址添加,并介绍内部C++依赖包的上传、下载及版本维护方法。

2026.09.22

40

19

loomy官网入口地址合集
loomy官网入口地址合集

本专题汇总了 Loomy 桌面 AI 助理的官方入口地址合集及使用指南。提供 macOS 与 Windows 客户端下载 。Loomy 是讯飞推出的桌面级 AI 工作搭子,支持文件整理、数据分析、网页操作及通过飞书/钉钉远程操控电脑,助你高效完成本地办公任务 。

2026.09.22

40

19

NumPy常见函数使用方法
NumPy常见函数使用方法

本专题整理 NumPy 常见函数使用方法相关教程,覆盖函数大全、参数用法、数组运算、统计聚合、排序处理、where 条件筛选、linspace 创建数列等常用场景,帮助读者快速掌握 NumPy 函数调用思路和实际数据处理技巧。

2026.09.22

60

21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.2万人学习