当前位置: 首页 > news >正文

图论---有向图的强连通分量(Tarjan求SCC)

强连通分量作用:有向图——>(缩点)有向无环图(DAG)

缩点:将所有连通的分量缩成一个点。

有向无环图作用/好处:求最短路/最长路 可以递推,按照拓扑图从前往后递推.

x 是否在某个强连通分量中?

情况1:存在后向边指向祖先节点。

情况2:先走到横叉边,横叉边再走到祖先。

时间戳:搜索时按照DFS顺序给每个点一个编号,

对每个点定义两个时间戳:

1、dfn[u] 表示遍历到 u 的时间戳

2、low[u] 从 u 开始走,所能遍历到的最小的时间戳是什么

u 是其所在强连通分量的最高点 等价于 dfn[u] == low[u]

 以下是Tarjan模板

//O(n+m)时间复杂度
//求强连通分量的过程
void tarjan(int u){//刚遍历到的时候dfn[u]=low[u]=++timestamp;//时间戳stk[++top]=u,in_stk[u]=true;//栈中里面存的所有点都是//当前还没有遍历完的强连通分量的所有点//在强连通分量中,并且这个强连通分量还没有遍历完//遍历所有 u 能到的点for(int i=h[u];~i;i=ne[i]){int j=e[i];//u 还没被遍历过if(!dfn[j]){//遍历一下这个点tarjan(j);low[u]=min(low[u],low[j]);}else if(in_stk[j]){low[u]=min(low[u],dfn[j]);}}//else 里面的 j 要么是祖先要么是横叉点if(dfn[u]==low[u]){int y;++scc_cnt;do{y=stk[top--];in_stk[y]=false;id[y]=scc_cnt;}while(y!=u);}
}缩点
用邻接表存
遍历所有点,遍历 i 的所有邻点
if(i 和 j 不在同一个SCC中){加一条新边 id[i] -> id[j] 存的是i所在的连通分量的编号
}
建成的图是 有向无环图
DAG可以用拓扑排序来做
连通分量编号递减的顺序一定是拓扑序

http://www.xdnf.cn/news/244171.html

相关文章:

  • 程序代码篇---ESP32云开发
  • 深入解析 .NET Kestrel:高性能 Web 服务器的架构与最佳实践
  • NUC非均匀校正算法框架
  • Centos 7 yum配置出现一下报错:
  • 怪物猎人:世界-冰原10000+mod整合包5月最新更新!
  • 2025年RAG技术发展现状分析
  • cPanelWHM 的 AutoSSL
  • ctfshow web入门 web45
  • 哈希表笔记(二)redis
  • 机器人--架构及设备
  • Unity SpriteAtlas (精灵图集)
  • 使用vue的插值表达式渲染变量,格式均正确,但无法渲染
  • LabVIEW在工业设备故障诊断报告领域的深度开发与发展趋势
  • Python-57:Base32编码和解码问题
  • Git 基本操作(一)
  • DeepSeek 赋能自然语言处理:从理论到实践的全方位解析
  • GESP2024年6月认证C++八级( 第二部分判断题(1-5))
  • 【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?
  • 驱动开发系列55 - Linux Graphics QXL显卡驱动代码分析(二)显存管理
  • C++11新特性_自动类型推导
  • (34)VTK C++开发示例 ---将图片映射到平面
  • PostgreSQL数据库操作SQL
  • 2025年- H17-Lc125-73.矩阵置零(矩阵)---java版
  • 坚鹏:工行《DEEPSEEK赋能银行智能办公及数字化营销服务》培训
  • [蓝桥杯 2023 国 Python B] 划分 Java
  • 如何快速定位网络中哪台主机发起ARP攻击
  • 范式演进:从ETL到ELT及未来展望
  • 如何提升个人的稳定性?
  • 学习 Django 之前
  • 数据结构——树(中篇)