tarjan学习笔记

news/发布时间2024/5/17 17:27:58

tarjan学习笔记

0.前置知识

  • 强连通图

    在一个有向图中,若从任意一点可以到达其他所有点,则称之为强连通图

  • 强连通分量(SCC)

    一个图中的极大强连通性质子图(强连通图的强连通分量是它本身)

    \(\small {极大强连通子图指一个不能加入另外的点的强连通子图(一个强连通子图可能包含一个或多个小的强连通子图)}\)

  • dfn(时间戳)

    在对图的遍历中,各个顶点被遍历的顺序( \(dfn[i]\) 表示节点 \(i\) 第几次被遍历到)

  • low(追溯值)

    可以理解为,在一个节点存在的路径中,最小的 \(dfn\) 值( \(low[i]\) 表示在节点 \(i\) 存在的路径中,最小的 \(dfn\) 值)

  • 搜索树

    在一张连通图中,所有的节点以及发生递归的边共同构成一棵搜索树。如果这张图不连通,则构成搜索森林。
    tu

    如图 从lrb博客上扣下来的

    • 搜索树上的边,称为 树边(绿色)。
    • 从祖先指向后代的非树边,称为 前向边(蓝色)。
    • 从后代指向祖先的非树边,称为 返祖边(黄色)。
    • 从子树中的节点指向另一子树节点的边,称为 横叉边(红色)。

1. tarjan求有向图强连通分量

  • 强连通分量判定法则

    其实是求一个节点属于哪个强连通分量

    • \(low\) 的更新方式

      设 当前访问的节点为 \(x\), \(x\) 能到达的点为 \(y\)

      • 初始化 dfn[x]=low[x]=++tot

      • \(y\) 未被遍历到,则该边为树边,递归访问 \(y\) , 因为 \(low\) 的性质,令low[x]=min(low[x],low[y])

      • \(y\) 被遍历过且在栈中,则该边为返祖边或横叉边(存疑),因为 \(low\) 的性质,可以回到 \(x\),令low[x]=min(low[x],low[y])

    • 主要判断方式

      dfn[x]==low[x] 可以理解为 节点 \(x\) 能返回到最早的节点就是 \(x\) 本身,则节点 \(x\)\(s.top()\) 内的所有节点为一个强连通分量。

    • 常用变量

      cnt:强连通图数量

      dfn[]:节点 \(i\) 第几次被遍历到

      low[]:在节点 \(i\) 存在的路径中,最小的 \(dfn\)

      belong[]:节点 \(i\) 属于第几个强连通图

      inStack[]:节点 \(i\) 是否在栈中

      tot:当前已有几个节点被访问

    • 代码实现

    inline void tarjan(int x){dfn[x]=low[x]=++tot;s.push(x);inStack[x]=1;for(int i = Head[x];i;i=Next[i]){int y=Ver[i];if(!dfn[y]){dfs(y);low[x]=min(low[x],low[y]);}else if(inStack[y])low[x]=min(low[x],low[y]);}if(dfn[x]==low[x]){cnt++;while(s.top()!=x){belong[s.top()]=cnt;inStack[s.top()]=0;s.pop();}inStack[x]=0;belong[x]=cnt;s.pop();}
    }
    
  • 缩点

    因为一个节点只属于一个强连通分量,所以对于一些问题,我们可以将一个强连通分量看做一个点。

    即若存在有向边 x->y,若 belong[x]!=belong[y] 则建立一条边 belong[x] -> belong[y]。

    • 代码实现
    for(int i = 1;i <= n;i++){for(int j=A.Head[i];j;j=A.Next[j]){int y=A.Ver[j];if(belong[i]!=belong[y]){A_.add(belong[i],belong[y]);outp[belong[i]]++;}}
    }
    

    \(\small{ps:A,A\_ 为封装的链式前向星。}\)

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

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

相关文章

Educational Codeforces Round 155 (Rated for Div. 2)

Educational Codeforces Round 155 (Rated for Div. 2) A--C(未更新完)比赛链接 A. Rigged! 题目链接 就是一个比较简单的模拟就可以解决,如何判断能不能第一只需要考虑比他力量大的耐力是不是也比他大就行,而只要比他大,他就不可能第一,否则输出他的力量作为标杆就行,这样…

创建电话号码转换器应用

在本练习中,你将为电话拨号器应用构造 UI,并实现此 UI 背后的逻辑。 你将构建一个 UI,此 UI 利用 .NET MAUI 和 .NET MAUI Essentials 包的 UI 功能拨打电话。 该应用使用户可在输入字段中键入文本,并将该文本转换为数字。 它将使用电话键盘上显示的字母作为转换的基础。 例…

tita升级 | 绩效考核内置系统模板

升级详情: Tita - OKR和新绩效一体化管理平台1.【考核模板】考核内置系统考核模板,支持预览及套用使用场景一:对于很多进行绩效考核的企业来说,对于考核指标以及评价流程的设置上都存在一定的困惑,毕竟想要通过绩效考核的方式来提高员工和公司的绩效并不是一件简单的事情。…

学信息系统项目管理师第4版系列11_信息安全管理

信息安全管理1. 信息安全基础 1.1. 保密性(Confidentiality) 1.1.1. 信息不被未授权者知晓的属性 1.1.2. 确保信息不暴露给未授权的实体或进程 1.2. 完整性(Integrity) 1.2.1. 信息是正确的、真实的、未被篡改的、完整无缺的属性 1.2.2. 只有得到允许的人才能修改数据,并且能…

Spring 03 Spring+Mybatis整合

配置类 jdbc.propertiesjdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3307/myb?useSSL=false&useUnicode=true&characterEncoding=UTF-8 jdbc.username=root jdbc.password=123 MybatisConfid.javapackage com.config;import com.github.page…