首页 > 其他分享 >Tarjan 学习笔记

Tarjan 学习笔记

时间:2023-11-08 20:44:39浏览次数:51  
标签:Tarjan 结点 连通 笔记 学习 dfn 搜索 low textit

萌新刚学Tarjan,啥也不会,肯定一堆错,请大佬指正谢谢

前置

强连通

  • 强连通:

在不是强连通图的有向图\(G\)内,其顶点\(u\),\(v\)两个方向上都存在有向路径,则\(u\)和\(v\)强连通

  • 强连通图:

对于有向图 \(G\) ,若\(G\)中任意两个结点连通,则称有向图\(G\)强连通。

  • 强连通分量:

有向图的极大强连通子图

对于\(G\)的极大强连通子图\(S\),添加任意顶点都会导致\(S\)失去强连通的属性

DFS生成树

DFS生成树主要有\(4\)种边:

  1. 树边:黑色边,每次搜索找到一个还没有访问过的结点的时候就形成了一条树边
  2. 反祖边:红色边(\(7 \rightarrow 1\) )指向祖先结点的边
  3. 横叉边:蓝色边(\(9 \rightarrow 7\))在搜索的时候遇到了一个已经访问过的结点,这个结点并不是当前结点的祖先
  4. 前向边:绿色边(\(3 \rightarrow 6\) )搜索的时候遇到子树中的结点的时候形成的

若结点\(u\)是某个强连通分量在搜索树中遇到的第一个结点(就是根),那么这个强连通分量的其余结点肯定是在DFS搜索树中以\(u\)为根的子树中。

正文

割点

强连通分量

维护变量:

  • \(\textit{dfn}_u\) :深度优先搜索遍历时结点 \(u\) 被搜索的次序。

  • \(\textit{low}_u\) :在 \(u\) 的子树中能够回溯到的最早的已经在栈中的结点。设以 \(u\) 为根的子树为 \(\textit{Subtree}_u\) 。 \(\textit{low}_u\) 定义为以下结点的 \(\textit{dfn}\) 的最小值: \(\textit{Subtree}_u\) 中的结点;从 \(\textit{Subtree}_u\) 通过一条不在搜索树上的边能到达的结点。

一个结点的子树内结点的 \(\textit{dfn}\) 都大于该结点的 \(\textit{dfn}\)。

从根开始的一条路径上的 \(\textit{dfn}\) 单调递增,\(\textit{low}\) 单调不下降。

算法

按照 dfs 序对所有结点进行搜索,维护每个点的 \(\textit{dfn}\) 与 \(\textit{low}\) ,让搜索到的结点入栈。每找到一个强连通元素,就按照该元素包含结点数目让栈中元素出栈。搜索过程中,对于结点 \(u\) 和与其相邻的结点 \(v\)(\(v\) 不是 \(u\) 的父节点)进行分类讨论:

  • \(v\) 未被访问:继续对 \(v\) 进行dfs。在回溯过程中,用 \(\textit{low}_v\) 更新 \(\textit{low}_u\) 。因为存在从 \(u\) 到 \(v\) 的直接路径,所以 \(v\) 能够回溯到的已经在栈中的结点, \(u\) 也一定能够回溯到。

  • \(v\) 被访问过,在栈中:根据 low 值的定义,用 \(\textit{dfn}_v\) 更新 \(\textit{low}_u\) 。

  • \(v\) 被访问过,不在栈中:说明 \(v\) 已搜索完毕,其所在连通分量已被处理,所以不用对其做操作。

标签:Tarjan,结点,连通,笔记,学习,dfn,搜索,low,textit
From: https://www.cnblogs.com/LuoTianYi66ccff/p/17818241.html

相关文章

  • Maven入门和进阶笔记
    一、Maven简介和快速入门1.1Maven介绍Maven是一款为Java项目构建管理、依赖管理的工具(软件),使用Maven可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。Maven就是一个软件,掌握软件安装、配置、以及基本功能(项目构建、依赖管理)使用就是本课程的主要目标!1.2......
  • java基础学习:二进制,八进制,十六进制
      ......
  • 《代码大全》阅读笔记05
      随着项目规模的增加,下面这些活动的工作量增长超过线性:交流计划管理需求分析系统功能设计接口设计和规格说明架构集成消除缺陷系统测试文档生成在社交场合,活动越正式,你所穿的服装就会越不舒服(高跟鞋、领带等等)。在软件幵发领域里,项目越正规,你不得不写的文......
  • 单调栈学习笔记
    今天模拟赛B没想出来,甚至没到单调栈那一步。到了可能也不会做。发现单调栈已经忘干净了,之前学过的悬线法也不太会,这里补一下单调栈。板子:HISTOGRA-LargestRectangleinaHistogram在我的这篇博客里有题解。总之我自己是看懂了的。单调栈求最大全1子矩阵问题P4147玉......
  • 11/8训练笔记
    P6273[eJOI2017]魔法题解考虑定义\(S_{r_k}=\Sigma_{i=1}^{r}[s_i=k]\),那么对于任意一个子串\([l,r]\),其为有魔法的子串的充要条件为\(S_{c_{r}}-S_{c_{l-1}}\)对于任意的,在\(s\)中出现了的\(c\)为定值。任取一个在\(s\)中出现了的字符\(A\),那么上述充要条件可转换......
  • electron+vite笔记
    1、配置国内electron 镜像   .npmrc   electron_mirror=https://registry.npmmirror.com/-/binary/electron/  electron_builder_binaries_mirror=https://registry.npmmirror.com/-/binary/electron-builder-binaries/2、创建vite项目    pnpmcreate......
  • C++笔记 -- 使用STL的function实现回调机制(回调函数)
    1.使用普通函数示例一 代码:#include<iostream>#include<functional>//定义一个回调函数类型usingCallback=std::function<void(int)>;//定义一个函数,用于演示回调函数的使用voidperformOperation(intdata,Callbackcallback){//执......
  • 世界上最全面的elasticsearch学习之路,祝你早日学成归来
    开胃菜,核心知识篇elasticsearch安装和使用elasticsearch索引curd,mapping映射,queryDSLelasticsearch分词器characterfilter,tokenizer,tokenfilter elasticsearch聚合查询Elasticsearch-直观了解查询(term、match、match_phrase和query_string)区别ES搜索(con......
  • kafka第二天学习笔记
    第二天学习Kafka,我们继续深入了解这个分布式流处理平台的核心概念和功能。以下是一些重要的知识点和概念:Kafka的消费者组:消费者组是多个消费者实例的组合,可以共同消费一个topic中的消息。消费者组中的每个消费者会均匀分配topic中的消息,实现负载均衡和高可用性。Kafka的分区策略:当......
  • 11.8读书笔记《需求掌握过程》02
    所谓需求,就是那些必须在开始进行产品构建前发现的东西,如果在构建的过程中才发现需求,或者更晚更糟,直至客户已经在使用产品的时候才发现需求,那么代价将会是很大的,效率也将十分低下。《掌握需求过程》这本书中,讲述了身为一个需求分析师,应完成的几个工作内容。按书中所说,分析师即......