强连通分量学习笔记+杂题

图论系列:

前言:

僕は
明快さ故にアイロニー
優柔不断なフォローミー
後悔後悔夜の果て

相关题单:戳我

一.强连通分量相关定义

基本摘自oi wiki ,相关定义还是需要了解。(实际就是搬了个oi wiki)
强连通分量主要在研究有向图可达性,针对的图类型为有向弱联通图。

1.强连通定义

强连通:对于有向图的两点 \(u,v\),它们互相可达。

强连通图:满足图内任意两点强连通的有向图。

强连通分量(Strongly Connected Components,SCC):极大的强连通子图。(也就是说在同一强连通分量的任意两点都是互相可达的,于是在关心可达性时,同一强连通分量内的点等价)。

一般使用 Tarjan 求强连通分量。

2.有向图 DFS 树

对于一张有向图,对其跑 DFS ,不经过已经遍历过的点的前提下,遍历过程可以看似一颗树,称作有向图 DFS 树,单从某一点出发 DFS,不一定能访问到图上的所有结点,所以一般有向图 DFS 树是一个森林。

形成若干棵 DFS 树后,在研究强连通性时,它们之间相互独立。对于任意强连通的两点 \(u,v\) ,第一次访问它们所在的强连通分量的 DFS 树一定同时包含 \(u,v\)

我们一般用时间戳 \(dfn_i\) 表示遍历到点 \(i\) 的时间,可以得到遍历到各个点的先后顺序。

不同于一般的树,除了树边还有其他类型的边,如图,有向图的 DFS 生成树主要有 4 种边(不一定全部出现):

树边:就是遍历的时候经过的边,示意图中以黑色边表示,,在每次搜索找到一个还没有访问过的结点的时候就形成了一条树边。

反祖边:示意图中以红色边表示(即 \(7 \rightarrow 1\) ),也被叫做回边,即指向祖先结点的边。

横叉边:示意图中以蓝色边表示(即 \(9 \rightarrow 7\) ),它主要是在搜索的时候遇到了一个已经访问过的结点,但是这个结点并不是当前结点的祖先。

前向边:示意图中以绿色边表示(即 \(3 \rightarrow 6\) ),它是在搜索的时候遇到子树中的结点的时候形成的。

由于强连通分量主要和性有关,现在讨论各类边对可达性的影响:

对于前向边 \(u \to v\)\(u\) 本来通过树边就可到达 \(v\),所以对可达性没有影响。

对于反祖边 \(v \to u\)\(u\) 本身可以通过树边到达 \(u \to v\) 路径上的所有点 ,而这条返祖边使得所有在 \(u \to v\) 路径上的点可以到达点 \(u\),于是 \(u \to v\) 路径上的所有点就构成了一个强连通分量。多个返祖边结合可以形成更大更复杂的强连通结构。

对于横叉边,也可以使得时间戳减小。

通过讨论我们可以发现:

\(u,v\) 强连通,则 \(u,v\) 在树上路径上的所有点强连通。

强连通分量在有向图 DFS 树上弱连通。

3. Tarjan 求 SCC

Tarjan 算法基于对图进行 深度优先搜索。我们视每个连通分量为搜索树中的一棵子树,在搜索过程中,维护一个栈,每次把搜索树中尚未处理的节点加入栈中。时间复杂度是 \(O(n+m)\) 的。

在 Tarjan 算法中为每个结点 \(u\) 维护了以下几个变量:

\(dfn_u\) :就是在 DFS 树内的时间戳。(一个结点的子树内结点的 dfn 都大于该结点的 dfn 值。)

\(low_u\) :在 u 的子树中能够回溯到的最早的已经在栈中的结点。设以 \(u\) 为根的子树为 \(T_u\)\(T_u\) 定义为以下结点的 \(dfn\) 的最小值:\(T_u\) 中的结点;从 \(T_u\) 通过一条不在搜索树上的边能到达的结点(要么是返祖边,要么是横叉边)。(一般初始化 \(low_u=dfn_u=++num\)

按照深度优先搜索算法搜索的次序对图中所有的结点进行搜索,维护每个结点的 dfn 与 low 变量,且让搜索到的结点入栈。每当找到一个强连通元素,就按照该元素包含结点数目让栈中元素出栈。在搜索过程中,对于结点 \(u\) 和与其相邻的结点 \(v\)\(v\) 不是 \(u\) 的父节点)考虑 3 种情况:

\(v\) 未被访问:继续对 \(v\) 进行深度搜索。在回溯过程中,用 \(low_v\) 更新 \(low_u\)。因为存在从 \(u\)\(v\) 的直接路径,所以 \(v\) 能够回溯到的已经在栈中的结点,\(u\) 也一定能够回溯到。
\(v\) 被访问过,已经在栈中:根据 low 值的定义,用 \(dfn_v\) 更新 \(low_u\)
\(v\) 被访问过,已不在栈中:说明 \(v\) 已搜索完毕,其所在连通分量已被处理,所以不用对其做操作。

对于一个连通分量图,我们很容易想到,在该连通图中有且仅有一个 \(u\) 使得 \(dfn_u=low_u\)。该结点一定是在深度遍历的过程中,该连通分量中第一个被访问过的结点,因为它的 dfn 和 low 值最小,不会被该连通分量中的其他结点所影响。

因此,在回溯的过程中,判定 \(dfn_u=low_u\) 是否成立,如果成立,则栈中 \(u\) 及其上方的结点构成一个 SCC。

一些结论:

一个点属于一个 SCC。

SCC 缩点后,得到的新图不含环,否则环上所有结点对应的 SCC 可以形成一个更大的 SCC。这说明 SCC 缩点图是一张 DAG

对于两个 SCC ,\(S1\) 若可达 \(S2\)\(S1\)\(S2\) 后弹出栈。按弹出顺序写下所有 SCC,得到缩点 DAG 的反拓扑序。因此,按编号从大到小遍历 SCC,就是按拓扑序遍历缩点 DAG。

Tarjan 缩点代码

inline void dfs(int u)
{dfn[u]=low[u]=++num,vis[u]=1;//初始化,标记u在栈内s.push(u);//s是栈for(int i=head[u];i!=0;i=p[i].next){int v=p[i].to;if(!dfn[v])//子树内没有遍历过的点{dfs(v);low[u]=min(low[u],low[v]);}else if(vis[v]) low[u]=min(low[u],dfn[v]);//不在子树内&没有处理过的点}if(low[u]==dfn[u])//是关键点{int x;++tot;//缩后点数+1while(1){vis[(x=s.top())]=0;//出栈,已经操作,取消标记s.pop();if(x==u) break;//已经把栈内u上面的弹完了,退出}}
}

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

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

相关文章

CMake 生成器表达式---条件表达式和逻辑运算符

CMake 的生成器表达式用于在构建系统级别上进行条件判断和逻辑运算,它们通常用在目标属性和生成器表达式上下文中。这些表达式允许你根据不同的平台、配置或编译器来定制构建过程。【写在前面】 CMake 的生成器表达式用于在构建系统级别上进行条件判断和逻辑运算,它们通常用在…

ESP32-LVGL驱动框架

ESP32另一种LVGL驱动架构问题背景 最近在调试一个新屏幕的过程中,使用LVGL官方的lvgl_esp32_driver驱动,在我这个分辨率比较大(454 x 454)的屏幕下会出现,在分配完成buff后,若buff过大会出现,在刷屏的时候会这种警告。 txdata transfer > hardware max supported len研…

goland 把多个项目窗口合并到一个窗口

有时我们可能想把goland 每个项目窗口合并到一个窗口,每个项目以一个tab的形式展示,下面是合并的方法 点击「Window->Merge All Project Windows」即可

Word_共享编辑

打开链接 ? 点击右上角的"登录"点"编辑"→点"在桌面版中打开"共享编辑 ok

手把手教你如何下载中国大学mooc慕课上已关闭的视频课程和课件资料

随着线上教育的普及,越来越多的大学开始提供线上教育,以方便学生的在线学习。然而,有些课程在结束后就会被关闭,导致学生无法再次观看。如果你想下载这些已经关闭的视频课程,该怎么办呢?其实我们可以通过一些工具来下载这些已关闭的课程。这里以中国大学Mooc网站为例,教…

汉文博士新增《通用规范汉字表》等多个字表

汉文博士的字表可以用于在部首、构型、粤拼和拼音检索中突出显示或筛选汉字。 今天将之前上传的字表全部重新生成了一遍,在词典管理界面双击字表可查看字表内含的汉字数量。 另外,还新增了如下字表:现代汉语通用字表 现代汉语常用字表 通用规范汉字表 台湾“常用国字”标准字…

Normalized Mutual Information(NMI, 归一化互信息)

Normalized Mutual Information(NMI, 归一化互信息)值域是 $[0,1]$,值越高表示两个聚类结果越相似。归一化是指将两个聚类结果的相似性值定量到 $0\sim 1$ 之间。$$ \text{NMI}=\frac{2\sum_i\sum_jn_{ij}ln\frac{n_{ij}N}{n_in_j}}{-\sum_in_iln\frac{n_i}{N}-\sum_jn_jln\fr…

模拟赛总结(四)(终章?)

2024.10.30 T1 追逐游戏 (chase) 被自己的分讨绕死了,以后要学会简化code T2 统计code T3 软件工程 选前\(k - 1\)长的 + 剩下求交集可得\(96\) ~~为什么我贪的不对qwq ~~ 把这个贪心改成大炮就是整洁的一部分 定义\(dp_{i,j}\)表示前\(i\)条线段放到\(j\)个集合里,那么上述方…

【红队】利用 PsycheShell 进行 Paste Jacking 以获取隐秘的反向 Shell

原创 Ots安全介绍 在网络安全领域,粘贴劫持 (Paste Jacking)等技术代表着社会工程攻击日益复杂的趋势。当用户从网页上复制看似无害的内容,但粘贴的内容却遭到恶意篡改时,就会发生粘贴劫持。攻击者可以使用此技术在目标机器上执行命令,尤其是当用户粘贴到终端等敏感环境中时…

数据采集与融合技术实践课第三次作业

数据采集与融合技术实践课第三次作业这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology码云作业gitee仓库 https://gitee.com/huang-yuejia/DataMining_project/tree/master/work3学号 102202149姓名 黄悦佳目录数据采集与融合技…

猿人学web端爬虫攻防大赛赛题第17题——天杀的http2.0

题目网址: https://match.yuanrenxue.cn/match/17 解题步骤:老方法,看触发的数据包。只有一个数据包,再看cookie中有没有特殊的字段。没有遇到第13题的特殊字段,直接访问。import requestsurl = "https://match.yuanrenxue.cn/api/match/17?page=1" headers = …

你知道多少种API架构风格

以下是最常用的几种风格:👇🌟 『SOAP』:成熟、全面的XML基础风格,最适合企业应用。🌐 『RESTful』:流行、易于实现的HTTP方法风格,理想用于Web服务。📚 『GraphQL』:查询语言风格,请求特定数据,减少网络开销,响应更快。🚀 『gRPC』:现代、高性能的Protocol…