Tarjan双连通分量算法论文翻译

Tarjan 算法 1972 年原始论文精读:从 DFS 到线性时间 SCC 的 4 个关键洞察 本文深入解析了Tarjan算法1972年原始论文,揭示了从DFS到线性时间强连通分量(SCC)计算的四个关键洞察。文章详细探讨了栈不变性、lowlink定义等核心设计思想,展示了Tarjan如何将DFS提升为强大的算法范式,实现O(n+m)时间复杂度的SCC计算,并分析了其现代应用与扩展方向。 阅读详情


Depth-First Search and Linear Graph Algorithms


        Tarjan在1972年发表了这篇关于线性图论算法的论文,在论文中详细分析了深度优先搜索的各种性质,并且利用其性质给出了两个应用:无向图的双连通分量以及有向图的强连通分量。
        在此将对其中的双连通分量算法做出一些翻译解释。仅需要你对DFS发现时间以及后向边有了解即可。

一、首先给出一些定义:

  1. 树边:深度优先森林(无相连通图中深搜树T)中的边。
  2. 后向边:后向边(u,v)是将点u连接到其深度优先搜索树中的一个祖先节点v的边。
  3. Palm Tree(简称P):由树边和无向边以及这些点构成的图。
  4. 双连通图:设G = (V,E)为一无向连通图,对于V中的每三个点v,w,a,都有一条路径从v到w而不用经过a,我们就称G为双连通图。
  5. 关节点:设G中三点v,w,a,若任何从v到w的路径(至少有一条)都要经过a,我们就称a为G的一个关节点。

  • 注意虽然双连通分量值针对于无向图,但是其DFS生成的P以及T都是有向图,T是P的子图。

    于是有引理:设G  = (V,E),若定义位于同一环路的边为等效边,则根据此将边进行划分Ei,边的端点集Vi,则我们称Gi = (Vi,Ei)为G的一个双连通分量。

双连通分量有以下性质:

  1. Gi之间互不包含。
  2. G中每个关节点至少出现一次在Vi中,每个非关节点都只出现在 一个Vi里面。
  3. Vi与Vj(i != j)交集最多只有一个元素,这个元素也就是图G的关节点。

二、双连通分量定理及实现


       设number[u]为点u的发现时间,low[u]为点u在palm tree中能到达的最早点的发现时间。

       定理:设无向连通图中三点u,v,a若(a,v)是T(不包括后向边)也即是P的一条边,并且u不是v在T中的子孙节点,如果low[v] >= number[a],则a是G的一个关节点并且去掉a以后v和u将不会连通。

      证明:因为a可到v并且low[v] >= a,所以从v出发的点若不经过a则只能在v以及v的子孙节点中,又因为u不是v在T中的子孙节点,所以a是G的一个关节点。

       上图是论文中的一个例子,图(a)表示无向连通图,图(b)给出了palm tree,点旁边的记号分别为发现时间以及low值,带星号的点为关节点。其中的后向边由虚线给出。

为了进一步分析问题,给出求双连通分量的代码:

int BiConnect(short v,short u)  //u is the father of v in spanning T
{
    number[v] = low[v] = index++;
    for(short w = 1;w <= N;w++)
    {
        if(w != u&&w != v&&graph[v][w])    //可行边并且不能是其本身以及其父节点
        {
            edge newEdge;
            newEdge.x = v;
            newEdge.y = w;
            if(!number[w])      //w还没标记,则w将是v的一个子节点
            {
                edgeStack[stackTop++] = newEdge;       //将边压入栈
                BiConnect(w,v);                         //继续深搜
                low[v] = min(low[v],low[w]);           //深搜返回后调整low值
                if(low[w] >= number[v])                //有双连通分量或者桥边
                {
                    memset(bcc,0,sizeof(bcc));
                    while((--stackTop)&&(edgeStack[(stackTop)].x != newEdge.x||edgeStack[(stackTop)].y != newEdge.y))   //将直到(v,w)的边出栈
                    {
                        bcc[edgeStack[stackTop].x][edgeStack[stackTop].y] = 1;      //将边保存到双连通分量bcc
                    }
                    bcc[edgeStack[stackTop].x][edgeStack[stackTop].y] = 1;
                }
            }
            else if(number[w] < number[v])      //(v,w)是后向边,说明有环路
            {
                edgeStack[stackTop++] = newEdge;
                low[v] = min(low[v],number[w]);
            }
        }
    }
    return 0;
}

  • 在代码中,无向图以及双连通分量都是采用的矩阵表示。
  • 根据tarjan算法,我们不断将遇到的树边以及后向边(只能是这两种边)压入栈,若遇到Low[w] >= number[v],则进行出栈以及双连通分量处理。注意此时的v不一定是关节点,(v,w)也不一定是桥(删除此边,图就不再连通)。
  1. 首先分析为什么不是么关节点,可以很容易举出反例,若G就是个单纯的环路,则DFS会一直往下走直到又回到根节点时,不等式等号成立,而根节点又显然不是关节点,单纯的环路图就没有关节点。这个与Tarjan的定理矛盾吗?当然是不矛盾的,注意定理题设中给出了三点,也即是必须还要有一点u不在v的生成树中,但是环路中,所有点(除了根节点)都在根节点的子树中了。所以求关节点时,代码中当v为根节点时,还要看DFS后子节点是否有超过两个,有的话则v是一个关节点(不同子树的点必须通过根节点连接)。
  2. 同样若G是单纯环路,则(v,w)显然也不是桥,注意到此时G是个双连通图,所有点的low值都等于number[root],所以不等式取等号说明(v,w)是双连通分量中的边,取大于号说明是桥。

POJ 3352 浅谈边双连通分量缩点 世界真的很大 刚刚才刷了一道边双连通的Tarjan 感觉不够,迅速再敲一道练手 然后1A,哇哇哇哇 虽然是一道水题,但我自己不会说出来233看题先:description: 给定图G,求最少加多少边可以成为双连通图。 input: The first line of input will consist of positive integers n and r, separated 阅读详情

相关推荐

从ICPC赛题实战解析C++图论:点双连通分量与构造算法

图论是计算机科学中研究图结构及其性质的核心领域,广泛应用于社交网络分析、路径规划和编译器优化。其核心原理是通过节点和边对关系进行建模,并利用深度优先搜索等算法分析连通性、最短路径等属性。掌握图论对于解决复杂工程问题具有重要价值,例如在分布式系统中确保数据一致性,或在算法竞赛中高效求解。点双连通分量作为图论中的一个关键概念,描述了图中不含割点的极大连通子图,是分析网络鲁棒性的重要工具。本文以一道ICPC赛题为具体应用场景,详细讲解如何运用Tarjan算法求解点双连通分量,并在此基础上设计C++构造算法为边分配

weixin_33585822的博客 338

科技的成就(二十七)

线性图论算法知名论文发表。在这篇“Depth-First Search and Linear Graph Algorithms”论文中,罗伯特·塔扬深入分析了深度优先搜索的各种性质,指出了强连通分量和双连通分量问题的高效算法,即 Tarjan 算法。...

347

Tarjan 算法论文 DEPTH-FIRST SEARCH AND LINEAR GRAPH ALGORITHMS.pdf

Tarjan 算法论文 DEPTH-FIRST SEARCH AND LINEAR GRAPH ALGORITHMS.pdf

关于tarjan算法

tarjan算法其实是在dfs基础上维护一个标志值来判断当前点是否是某种特殊点,而学习tarjan算法,通过tarjan的DEPTH-FIRST SEARCH AND LINEAR GRAPH ALGORITHMS学习好像并不是什么好的选择…但是读一读dalao的论文还是挺有趣的,本文对tarjan的论文进行简单翻译和补充我自己的理解。 一些符号和基础定义: 对于图G=(V,E)G=(V,E)G=(V,E)来说。 路径p:v⇒∗wp:v\stackrel{*}{\Rightarrow}wp:v⇒∗w表示存在

一个蠢人的博客 475

Tarjan算法

最近公共祖先LCA Tarjan算法

Depth-First Search and Linear Graph Algorithms - Tarjan (1972)-计算机科学

SIAM J. COMPUT. Vol. 1, No. 2, June 1972DEPTH-FIRST SEARCH AND LINEAR GRAPH ALGORITHMS*ROBERT TARJAN"Abstract. The value of depth-first search or "bacltracking" as a technique for solving problems is illustrated by two examples. An improved version of an algorithm for finding the strongly connected components of a directed graph and ar algorithm for finding the biconnected components of an un- direct graph are presented. The space and time requirements of both algorithms are bounded by k1V + k2E

Tarjan:这个算法大神

摘要:图的算法是进行静态分析的基础数据算法,如何提高图的分析效率,就需要对图的算法有进一步的认识。 1. 引言 在静态分析技术中, 我们常用会将代码转成抽象语法树(AST), 然后采用深度遍历(DFS)来完成对语法树的遍历和查询,找到潜在的问题缺陷。 对于语义的分析,我们采用的控制流和数据流也都无一例外的采用了以图为基础的算法, 通过图的可达性, 来完成变量、表达式的可达分析, 以及变量的依赖分析、值流图等等。 图的算法是进行静态分析的基础数据算法,如何提高图的分析效率,就需要对图的算法有进一步的认

华为云官方博客 2119

PHP实现深度优先搜索算法(DFS,Depth First Search)详解

主要介绍了PHP实现深度优先搜索算法(DFS,Depth First Search),简单分析了深度优先搜索算法的原理并结合具体实例给出了php实现深度优先搜索的具体步骤与相关操作技巧,需要的朋友可以参考下

Depth-first Search

Algorithm

UniversityGrass的博客 214

用Python玩转Carla-Apollo联合仿真:手把手教你实现自动驾驶测试

本文详细介绍了如何使用Python实现Carla-Apollo联合仿真,从环境搭建到自动驾驶算法测试的全流程。通过Carla提供的高逼真仿真环境和Apollo的自动驾驶算法栈,开发者可以高效验证感知、规划和控制模块。文章包含环境配置、Python API操作、桥接实现及实战测试,为自动驾驶开发提供完整解决方案。

wasm7browser的博客 267

INS/伪距组合导航(2)

伪距惯导组合导航

u014430081的博客 828

割点、桥与双连通分量:从Tarjan原理到实现全解析

在无向图连通性分析中,割点与桥是判断网络可靠性的基础概念,而双连通分量则进一步刻画了图的韧性。基于DFS的Tarjan算法通过dfn与low值,能够在线性时间内高效求解这些关键结构。理解其判定条件与技术价值,对网络容灾、环检测、缩点建树等工程实践至关重要。从网络关键节点识别到最少加边问题,双连通分量缩点与圆方树广泛应用于图论进阶。本文从DFS树出发,详细讲解割点、桥、边双与点双的判定规则与C++实现,并梳理常见误区。

weixin_33889665的博客 315

STC8G1K08A 实战应用:从配置到功能实现

本文详细介绍了STC8G1K08A单片机的实战应用,从开发环境搭建、GPIO配置、ADC模块使用到定时器中断处理和PWM输出等核心功能。重点讲解了外设模块的协同工作配置技巧,并分享了实际项目开发中的经验教训,帮助开发者快速掌握STC8G1K08A的高效应用。

n4o5p6q7r的博客 391

【无向图的双连通分量】

【点-双连通分量】 复制去Google翻译翻译结果

转移到dawxy.com 617

OPENSSL使用方法

预备知识KEY 通常指私钥。CSR 是 Certificate Signing Request 的缩写,即证书签名请求,这不是证书,只是包含申请证书的基本信息。生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。CRT 即 certificate的缩写,即证书。 X.509 是一种证书格式。对X.509证书来说,认证者总是CA或由CA指定的人,一份...

zxm8513优快云博客 1215

使用 MATLAB/Simulink 构建一个 核电站汽轮机与发电机协调控制系统 的仿真模型

在核电机组中,汽轮机-发电机系统是将核能最终转化为电能的关键环节。与火电机组不同,核反应堆的热惯性大、功率调节慢,因此汽轮机的控制策略需与反应堆特性相匹配,实现安全、稳定、高效的能量转换。维持发电机输出功率/频率稳定(响应电网调度)调节汽轮机进汽压力(匹配一回路蒸汽供应)实现“堆-机协调控制”保障机组在启停、变负荷、甩负荷等工况下的安全性本教程将带你使用构建一个核电站汽轮机与发电机协调控制系统汽轮机调速系统(调门控制)建模发电机与电网接口建模(同步机)

xiaoheshang_123的博客 189

poj 3177 Redundant Paths(双连通分量)

题意:给出一个无向图,要求添加最少的边令整个图双连通。 思路:求双连通分量,然后缩点,统计度数,最后直接算一下要连的边的个数……这种题也做过好几个了,感觉挺好做了 代码: #include #include #include #include #include #include #include #include #include #include #include #def

绝望的乐园 655

第11.4节 混合储能系统能量管理

混合储能系统(HESS)的能量管理策略采用分层架构实现多时间尺度优化:调度层(小时级)进行经济优化,协调层(秒级)基于频率分解分配功率,执行层(毫秒级)实现快速跟踪。深度强化学习(DRL)方法通过定义状态空间、动作空间和多目标奖励函数,能有效处理系统不确定性和多目标优化问题。HESS性能评估需综合技术指标(如调节性能Kp值、设备寿命指标)和经济指标(净现值NPV、平准化储能成本LCOS),并遵循"建模-仿真-实验"的闭环流程。

技术工作者 246

HDU-3749 Financial Crisis 并查集+点双连通分量:TaoToken 统一 Key 下的图论题解与调试配置

HDU-3749 Financial Crisis 用并查集判连通、Tarjan 求点双连通分量,割点多重归属需遍历 cutno 处理。本文给出可复制模板与 TaoToken 统一 Key 配置,三件套 Base URL、API Key、Model ID 一次写全,跑通样例并排查 401 等报错。详见 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_35751194的博客 3

【华为OD机试真题 2025B卷】737、统计监控器、需要打开多少监控器 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025B卷】737、统计监控器、需要打开多少监控器 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为

KJ.JK 716

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Tarjan桥算法实战:重边处理与权值特判的避坑指南

在图论中,桥(割边)是连接两个连通分量的唯一通道,其识别依赖于Tarjan算法中的dfn与low数组。通过DFS生成树,当low[v] > dfn[u]时,边(u,v)即为桥。该原理广泛应用于网络可靠性分析、社交社群发现等场景,用于定位单点故障链路。工程实践中,重边处理需用边编号而非父节点跳过反向边,否则会误判桥;同时需注意图不连通时答案为0、桥权为0时需派1人等边界条件。本文以一道经典最小桥权问题为例,深入拆解Tarjan桥算法的实现细节与常见陷阱,帮助读者真正掌握桥的判定与工程应用。

weixin_31220401的博客 83

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

有向图强连通分量的Tarjan算法

原文链接: https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected compo

zhan723284893的专栏 510

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

图论学习七之Cut & Bridge

原文链接: https://www.cnblogs.com/Mary-Sue/p/9340532.html 需要解决的问题•无向图的割点、割点集合与点连通度 •无向图的桥、 割边集合与边连通度 •无向图的割点与点双连通分量的求法 •无向图的桥与边双连通分量的求法、边双连通分量的构造•相关例题讨论  割点 •在无向连通图G上进行如下定义: •割点:若删掉某点P后,...

超神冉 1207

C++信奥图论:Tarjan求桥+边双缩点解决死胡同问题

在无向图算法中,桥(割边)是维持连通性的关键边,边双连通分量则代表内部无桥的极大子图。判断桥的经典算法是Tarjan,利用DFS时间戳与low值,在O(n+m)内标记所有割边。删去桥后对图染色缩点,可得到一棵“桥树”,其中度数为1的叶子节点正是“死胡同”入口的图论等价。这类建模在信息学竞赛与网络可靠性分析中十分常见,常用于将连通性问题转化为树结构问题。以ICPC WF真题P6255 Dead-End Detector为案例,可完整展示用C++实现Tarjan求桥、边双连通分量缩点及叶子判定,输出路标位置与方

weixin_32576389的博客 76

e-DCC缩点实战:POJ 3177冗余路径与Tarjan求桥

在图论中,边双连通分量(e-DCC)是处理无向图冗余路径的核心概念,通过Tarjan算法识别桥并将图缩点为一棵树,从而将复杂的连通性问题转化为树上的叶子节点配对问题。这一技术能有效提升网络的抗单点故障能力,广泛应用于网络布线、物流运输等场景。本文以POJ 3177为例,深入解析e-DCC缩点的原理与实现,涵盖Tarjan求桥、缩点技巧及常见问题排查,帮助读者掌握图论中的冗余路径优化方法。

weixin_33178839的博客 290
上一篇: POJ 2195--Going Home
下一篇: POJ 2942--Knights of the Round Table(双连通分量)
fu_ding1991
博客等级 码龄15年 14粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值