当前位置: 首页 > 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可以用拓扑排序来做
连通分量编号递减的顺序一定是拓扑序

相关文章:

  • 内存安全的攻防战:工具链与语言特性的协同突围
  • 【docker学习笔记】如何删除镜像启动默认命令
  • Spring AI开发跃迁指南(第二章:急速上手3——Advisor核心原理、源码讲解及使用实例)
  • 多线程系列二:Thread类
  • 安装linux下的idea
  • Git 基本操作(一)
  • ARM ASM
  • watch 数组 Vue 3
  • 【AI提示词】决策树专家
  • 【Linux网络】I/O多路转接技术 - poll
  • Dagster资产工厂实战:从Python到YAML配置的高效ETL流程
  • 面试手撕——迭代法中序遍历二叉树
  • Python 装饰器基础知识科普
  • 【嵌入式———通用定时器基本操作——实验需求2:案列:测量PWM的频率/周期】
  • 【二】数字图像处理基础(上)【数字图像处理】
  • Linux日常使用与运维的AI工具全景调研:效率革命的终极指南
  • SpringBoot使用分组校验解决同一个实体对象在不同场景下需要不同校验规则的问题
  • 坚鹏:平安保险集团《保险行业发展趋势与AI应用方法及案例》培训
  • SpringAI整合DeepSeek生成图表
  • 工行手机银行安全吗?在应用商店下载工商银行安全吗?
  • 辽宁男篮被横扫这一晚,中国篮球的一个时代落幕了
  • 陈颖已任上海黄浦区委常委、统战部部长
  • 海警巡航时海豚围舰艇嬉戏,专家:证明海域生态环境持续向好
  • 五一去哪玩?“时代交响”音乐会解锁艺术假期
  • 擦亮“世界美食之都”金字招牌,淮安的努力不止于餐桌
  • 宁波市纪委监委通报4起违反中央八项规定精神典型问题