Tarjan-割点问题

文章目录

    • 前言
    • 割点定义
    • 割点的求解
      • 割点判定定理
        • 证明(非严谨)
    • 算法实现
      • 算法流程
      • 代码详解
    • 再看SCC
    • OJ练习

前言

之前介绍Tarjan算法求强连通分量时,提到了代码段中对于访问过的邻接点应用其时间戳来更新追溯值,不是说用追溯值更新会导致答案错误,而是为了和后续双连通分量的代码保持统一。学习双连通分量求解,要先了解割点个割边的概念,本文来介绍割点。

关于Tarjan算法求解强连通分量,见:SCC-Tarjan算法,强连通分量算法,从dfs到Tarjan详解-CSDN博客


割点定义

在一个无向图中,如果将一个点及与该点相连的边删除后连通分量会被断开分为 2 个及以上,这个点就是一个割点(也称割顶)

割点的求解

割点的定义十分简洁,其求解思路也十分简单,同样是基于Tarjan-SCC算法(详见)。

割点判定定理

  • 如果x不是根节点,当搜索树上(注意条件为搜索树上)存在x的一个子节点y,满足low[y] ≥ dfn[x],那么x就是割点
  • 如果x是根节点(即连通分量中最早访问节点),当搜索树上存在至少两个子节点y1,y2,满足上述条件,那么x就是割点。

在证明之前,我们先通过下面例子来理解一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了方便说明,我们给的示例中点的编号与dfn值相同,旁边标注的是low值

**对于定理1:**定理1用于判定非根割点,对于示例,我们观察节点5,其邻接点low值均不小于5,我们发现割掉5后,原本的连通分量{1,2,3,4,5,6,7,8}变为了{1,2,3,4}、{6}和{7,8}

**对于定理2:**定理1用于判定根割点,那我们直接看根1,我们发现2,4,5均满足,此时满足条件的邻接点数目大于1,我们删掉1后得到了{2,3,4}和{5,6,7,8}


证明(非严谨)

定理1:

对于非根节点x,当搜索树上(注意是搜索树上而非原图上)存在x的一个子节点y,满足low[y] ≥ dfn[x],那么说明子节点y在不通过x的情况下是无法抵达比x时间戳更早的节点的,这也就说明了x是所在环的环顶,否则如果不是环顶,那么y一定可以通过环顶到达更早时间戳。

那么由于环顶x非根,所以x和环外节点有边连接,割掉x后必然能够多分出至少一个连通分支。

定理2:

先说明为什么搜索树上x只有一个子节点满足条件不是割点

由于根节点只跟自己连通分量内节点有边,与其他连通分量的点无边,当割掉根x,那么对于原连通分量来说并不会分为多个连通分量,因为原来根x的唯一满足条件的子节点y会成为新的根,因为除了y的其它子节点一定可以抵达y它们仍是一个连通分量

那如果至少有两个子节点(我们不妨设为y,z)满足呢?

那么对于yz而言,它们不通过x的情况下彼此互相不可达,即处于两个环否则搜索过程中二者时间戳早的那个一定可以访问晚的那个,这样就不存在y、z都满足条件了。

那么割掉x后,x所在环和y所在环由于失去x而互相不可达分为了两个连通分量,当满足条件的子节点大于2时,则会更多。

我们以下图为例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们观察右图搜索树,发现1只有2一个子节点,割掉1后,仍为一个连通分量。


算法实现

求解割点算法实现十分简单,我们要判定搜索树上节点的子节点,即我们深搜过程中访问子节点过程中还未访问的子节点,我们只要在这个过程中进行割点判断即可。

算法流程

  • 对x深搜,打时间戳
  • 访问子节点y
  • y未访问,则对y深搜,更新low[x]
    • 如果low[y] >= low[x],若x不是根,那么x为割点
    • 否则符合条件子节点数目child+1,如果child>1,x为割点
  • y已访问,更新low[x]

代码详解

#define N 20010
#define M 200100
//链式前向星
struct edge
{int v, nxt;
} edges[M];
int head[N]{0}, idx = 0;
void addedge(int u, int v)
{edges[idx] = {v, head[u]};head[u] = idx++;
}int dfn[N]{0}, low[N]{0}, tot = 0, root; 
// dfn 时间戳 low节点所能访问的最小时间戳 tot为访问节点的时间戳编号
bitset<N> cut;//cut标记数组void tarjan(int x)
{dfn[x] = low[x] = ++tot;int y, child = 0;for (int j = head[x]; ~j; j = edges[j].nxt){y = edges[j].v;if (!dfn[y])//搜索树上子节点{tarjan(y);low[x] = min(low[x], low[y]);if (low[y] >= dfn[x]){child++;if (x != root || child > 1)cut[x] = 1;}}else{low[x] = min(low[x], dfn[y]);}}
}

再看SCC

此时对于割点代码段中else语句“low[x] = min(low[x], dfn[y]);”应该理解为什么用父节点dfn值更新而非low值了,如果用low值,说明子节点可以越过父节点到达更早节点,这显然是不合理的,如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们SCC算法中用low[x] = min(low[x], dfn[y])是否会影响SCC算法正确性呢?自然不会,不然你OJ怎么过的,因为这不会影响我们根的判定,而且也不会影响从栈中获取SCC内的节点。

到这里,对于Tarjan求SCC应该就再无疑惑了。

OJ练习

P3388 【模板】割点(割顶) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

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

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

相关文章

结果实例: 一个cpu的parsec结果

简介 限于篇幅限制&#xff0c;很多教程和论文只展示部分结果。我们这里展示非常细节的结果&#xff0c;包括输出的许多命令行结果。 运行命令行 的shell窗口 ./build/X86/gem5.opt -d m5out/onlyoneCPUkvmCheckPointDifferRCS20231218restore \configs/deprecated/example/…

教务系统一键评教

利用浏览器的开发者模式实现“一键评教”&#xff0c;本教程针对金智教务系统 步骤 1、打开教务系统的评教页面。 2、按下键盘快捷键 F12&#xff0c;或者点击鼠标右键打开浏览器的开发者工具&#xff0c;然后选择控制台&#xff08;Console&#xff09;。 3、复制以下 Java…

大数据机器学习-梯度下降:从技术到实战的全面指南

大数据机器学习-梯度下降&#xff1a;从技术到实战的全面指南 文章目录 大数据机器学习-梯度下降&#xff1a;从技术到实战的全面指南一、简介什么是梯度下降&#xff1f;为什么梯度下降重要&#xff1f; 二、梯度下降的数学原理代价函数&#xff08;Cost Function&#xff09;…

[德人合科技]——设计公司 \ 设计院图纸文件数据 | 资料透明加密防泄密软件

国内众多设计院都在推进信息化建设&#xff0c;特别是在异地办公、应用软件资产规模、三维设计技术推广应用以及协同办公等领域&#xff0c;这些加快了业务的发展&#xff0c;也带来了更多信息安全挑战&#xff0c;尤其是对于以知识成果为重要效益来源的设计院所&#xff0c;防…

vue内容渲染

内容渲染指令用来辅助开发者渲染DOM元素的文本内容。常用的内容渲染指令有3个 1.v-text 缺点&#xff1a;会覆盖元素内部原有的内容 2.{{}}&#xff1a;插值表达式在实际开发中用的最多&#xff0c;只是内容的占位符&#xff0c;不会覆盖内容 3.v-html&#xff1a;可以把带有标…

MySQL表的增删改查(初阶)

CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。且增删改查&#xff08;CRUD&#xff0c;create&#xff0c;retrieve&#xff0c;update&#xff0c;delete&#xff09;数据库的核心模块。 1. 新增&#xff08;Create&#xff09; 实…

【数据结构】二叉树的模拟实现

前言:前面我们学习了堆的模拟实现&#xff0c;今天我们来进一步学习二叉树&#xff0c;当然了内容肯定是越来越难的&#xff0c;各位我们一起努力&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:数据结构 &#x1f448; &…

CogVLM与CogAgent:开源视觉语言模型的新里程碑

引言 随着机器学习的快速发展&#xff0c;视觉语言模型&#xff08;VLM&#xff09;的研究取得了显著的进步。今天&#xff0c;我们很高兴介绍两款强大的开源视觉语言模型&#xff1a;CogVLM和CogAgent。这两款模型在图像理解和多轮对话等领域表现出色&#xff0c;为人工智能的…

A01、关于JVM的GC回收

引用类型 对象引用类型分为强引用、软引用、弱引用&#xff0c;具体差别详见下文描述&#xff1a; 强引用&#xff1a;就是我们一般声明对象是时虚拟机生成的引用&#xff0c;强引用环境下&#xff0c;垃圾回收时需要严格判断当前对象是否被强引用&#xff0c;如果被强引用&am…

GaN图腾柱无桥 Boost PFC(单相)九-EMI 滤波器容性电流影响分析

前言 为了防止 PFC 变换器中高频开关谐波对电网产生影响&#xff0c;同时抑制电网中的高频干扰对变换器运行的影响&#xff0c;一般通过在 PFC 变换器与交流电源之间加入EMI 滤波器消除共模干扰和差模干扰&#xff0c;使变换器满足相应的 EMI 标准。在基于GaN 功率器件的图腾柱…

GD32F4中断向量查询

中断向量表 中断向量对应函数 __Vectors DCD __initial_sp ; Top of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ;…

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜C

老规矩&#xff0c;先看目录&#xff0c;平均每个3-4C&#xff08;C是月饼&#xff0c;月饼一般分为4块&#xff09; C是什么&#xff0c;是两个都不行了&#xff0c;但联合起来可以&#xff0c;联合的英文是combined&#xff0c;好的&#xff0c;我知道这个英文也记不住&#…

【Python】管理项目第三方包

我们在开发python项目时&#xff0c;如果代码每移植到到其他机器上&#xff0c;就手动 pip install XXX 安装一次&#xff0c;这样手动介入 是不是不太方便&#xff1f; 那么&#xff0c;python有像java一样的maven管理包的工具吗&#xff1f;只需要一个类似pom的文件&#xff…

Excel怎样统计一列中不同的数据分别有多少个?

文章目录 1.打开Excel数据表2.选择“插入”&#xff0c;“数据透视表”3.选择数据透视表放置位置4.将统计列分别拖到“行”和“数值”区间5.统计出一列中不同的数据分别有多少个 1.打开Excel数据表 2.选择“插入”&#xff0c;“数据透视表” 3.选择数据透视表放置位置 4.将统计…

c 实现jpeg中的ALI(可变长度整数转换)正反向转换

用于DC的ALI表&#xff1a;DIFF 就是前后两个8X8块DC的差值&#xff0c;ssss就是DIFF值用二进制表示的位数 亮度&#xff0c;与色度的DC都是这种处理的。两个相邻的亮度与亮度比差&#xff0c;色度与色度比差产生DIFF, 扫描开始DIFF等于0。 用于AC ALI表&#xff1a;表中的AC…

喜讯!聚铭网络入选国家信息安全漏洞库(CNNVD)技术支撑单位

近日&#xff0c;国家信息安全漏洞库&#xff08;CNNVD&#xff09;公示2023年度新增技术支撑单位名单。经考核评定&#xff0c;聚铭网络正式入选并被授予《国家信息安全漏洞库&#xff08;CNNVD&#xff09;三级技术支撑单位证书》。 国家信息安全漏洞库&#xff08;CNNVD&am…

解决腾讯云CentOS 6硬盘空间不足问题:从快照到数据迁移

引言&#xff1a; 随着数据的不断增加&#xff0c;服务器硬盘空间不足变成了许多运维人员必须面对的问题。此主机运行了httpd&#xff08;apache服务&#xff09;&#xff0c;提供对外web访问服务,web资源挂载在**/data/wwwroot目录下,http日志存放在/data/wwwlogs目录下&…

11 v-bind指令

概述 v-bind指令可以说是Vue3中最常用的指令之一&#xff0c;使用v-bind&#xff0c;我们几乎能够给任何实现动态的绑定比值。 这里&#xff0c;我们主要演示以下&#xff0c;通过v-bind动态绑定CSS样式。 基本用法 我们创建src/components/Demo11.vue&#xff0c;在这个组…

JS逆向实战——开发者工具检测

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、背景 在JS逆向领域&#xff0c;Chrome开发者工具是核心&#xff0c;抓包、调试、看调用栈等都离不开它。可以说&#xff0c;逆向人…

C语言--字符函数与字符串函数

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…