定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通;一张有向图上任意两个点可以相互到达,则称这张图为强连通图;非强连通图有极大的强连通子图,成为强联通分量。

如图,{1},{6}分别是一个强连通分量,{2,3,4,5}是一个强连通分量。而Tarjan算法可用于求解强连通分量。


Tarjan算法

Tarjan算法是基于深度优先搜索的算法,每个强连通分量都是搜索树中的一个子树。

实现:dfn[u]表示到u节点时的标记(时间戳),low[u]表示u所能走到的节点中,点的最小的次序号(dfn),每搜寻一个节点u,就把一个节点入栈,令dfn[u]=++it;low[u]=dfn[u]。u所连接的节点为v,若v已经被搜寻过,则low[u]=min(low[u],low[v])。若v没有被搜寻过,则dfs(v)low[u]=min(low[u],low[v])。搜寻完u所连接的所有的边后,若dfn[u]==low[u],则u这个点是该点所在强连通分量中编号最小的点。此时栈里的u节点上面的全部为该强连通分量的节点。

第一步:

点1有一条边指向2号点,而且2号点没有被遍历,dfs(2)。

第二步

2有一条边指向3,遍历三号点。

第三步:

3指向4,dfs(4)。

第四步:

dfs(5)。

第五步:

5号点存在两条边,两条边都要遍历,假设先走到2号点的边。因为2号点已经遍历过,所以直接比较即可,这时候要更新5号点的low。

第六步:

然后遍历6号节点。

第七步:

此时6号节点无法向外扩展节点,此时dfn[6]==low[6],因此6号节点就是一个强连通分量。弹出6号节点,回溯。此时图的遍历已经完成,所有的节点均已被打上标记。

第八步:

回溯到5号节点,low[5]!=dfn[5],继续回溯。

第九步:

回溯到4号节点,更新4号节点的low值。

第十步:

回溯到3号节点,更新3号的low值。

第十一步:

回溯到2号节点,此时low[2]==dfn[2],因此,栈中2号点上面的(包括2号点)全部在一个强连通分量中。将他们全部弹出。

第十二步:

回溯到1号节点,dfn[1]==low[1],因此1号节点也是一个强连通分量。弹出。

void tarjan(int u){
dfn[u]=++it;
low[u]=it;
for(int i=;i<tu[u].size();i++){
if(!in[tu[u][i]]){
in[tu[u][i]]=true;
s.push(tu[u][i]);
tarjan(tu[u][i]);
low[u]=min(low[u],low[tu[u][i]]);
}
else{
low[u]=min(low[u],low[tu[u][i]]);
}
}
if(low[u]==dfn[u]){
while(s.top()!=u){
s.pop();
}
s.pop();
}
}

最新文章

  1. PHP移动文件指针ftell()、fseek()、rewind()总结
  2. [Android]Volley源码分析(二)
  3. SQLSERVER2008R2正确使用索引
  4. ETL的数据来源,处理,保存
  5. 通过top命令发现plymouthd进程cpu负载达到近100% 解决办法
  6. ios中的几种多线程实现
  7. Java学习-037-JavaWeb_006 -- JSP 动作标识 - include
  8. 数据库关于group by 两个或以上条件的分析
  9. [DP之普通系列]
  10. CentOS7搭建Confluence Wiki
  11. IIS7.5应用程序池集成模式和经典模式的区别介绍
  12. ImageMagick图片服务器
  13. C语言面对对象设计模式汇编
  14. Brup Suite 渗透测试笔记(八)
  15. drone的pipeline原理与代码分析
  16. 超级详细使用Webpack4.X 搭建H5开发环境
  17. android 获得View的高度
  18. GROUP BY 和 ORDER BY 同时使用问题
  19. 安全测试6_Web安全工具第一节(浏览器入门及扩展)
  20. ubuntu x64 debootstrap

热门文章

  1. 并发编程 process 模块的方法及运用 僵尸与孤儿
  2. 内网主机使用yum安装软件
  3. mysql 开启root外部链接权限
  4. 深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统
  5. 记录-eureka
  6. 【centos】/usr/bin与/usr/local/bin的区别
  7. Vue仿string.format
  8. VBA解析Json(转)
  9. log4j 配置日志输出(log4j.properties)
  10. windows 下安装redis