强连通分量(strongly connected components)

   徐不可说        2018/8/4                                                        

定义(有向图):

在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components),也就是说是图G的一些特殊子集。

例如:

在此图中{1,2,3,4} {5} {6}为强连通分量。

Korasaju算法

首先要先理解一下转置图的定义:将有向图G中的每一条边反向形成的图称为G的转置G T 。(注意到原图和G T 的强连通分支是一样的)

算法思想:

1.深度优先遍历G,算出每个结点u的结束时间f[u],起点如何选择无所谓。

2.深度优先遍历G的转置图G T ,选择遍历的起点时,按照结点的结束时间从大到小进行。遍历的过程中,一边遍历,一边给结点做分类标记,每找到一个新的起点,分类标记值就加1。

3. 第2步中产生的标记值相同的结点构成深度优先森林中的一棵树,也即一个强连通分量。

下图为Korasaju算法寻找最强连通分量的一个例子:

图(a)是正图遍历 执行dfs

图(b)是逆图遍历 执行dfs、删除顶点

Korasaju算法比较关键的部分是同时应用了原图G和反图GT。 先用对原图G进行深搜形成森林(树), 然后任选一棵树对其进行深搜(注意这次深搜节点A能往子节点B走的要求是EAB存在于反图GT),能遍历到的顶点就是一个强连通分量。余下部分和原来的森林一起组成一个新的森林,继续步骤2直到 没有顶点为止。

以下为c++实现过程:

void dfsOne(int x)
{vst[x]=1;
for(int i=1;i<=n;i++)if(!vst[i]&&map[x][i])dfsOne(i);
d[++t]=x;
}
void dfsTwo(int x)
{vst[x]=t;for(int i=1;i<=n;i++)if(!vst[i]&&map[i][x])dfsTwo(i);
}
void kosaraju()
{int i,t=0;for(int i=1;i<=n;i++)if(!vst[i])dfsOne(i);memset(vst,0,sizeof(vst));t=0;for(int i=n;i>=1;i--)if(!vst[d[i]]){t++;dfsTwo(d[i]);}
}

Tarjan算法

Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。总的来说, Tarjan算法基于一个观察,即:同处于一个SCC中的结点必然构成DFS树的一棵子树。 我们要找SCC,就得找到它在DFS树上的根。其实,我们只要确定每个强连通分量的子树的根,然后根据这些根从树的最低层开始,一个一个的拿出强连通分量即可。那么剩下的问题就只剩下如何确定强连通分量的根和如何从最低层开始拿出强连通分量了。

算法思想:

dfn[u]表示dfs时达到顶点u的次序号(时间戳),low[u]表示以u为根节点的dfs树中次序号最小的顶点的次序号,所以当dfn[u]=low[u]时,以u为根的搜索子树上所有节点是一个强连通分量。 先将顶点u入栈,dfn[u]=low[u]=++idx,扫描u能到达的顶点v,如果v没有被访问过,则dfs(v),low[u]=min(low[u],low[v]),如果v在栈里,low[u]=min(low[u],dfn[v]),扫描完v以后,如果dfn[u]=low[u],则将u及其以上顶点出栈。

以下为c++实现过程:

void tarjan(int u){dfn[u]=low[u]=++num;st[++top]=u;for(int i=fpr[u];i;i=nex[i]){int v=to[i];if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}
else if (!co[v])low[u]=min(low[u],low[v]);}if(low[u]==dfn[u]){co[u]=++col;while(st[top]!=u){co[st[top]]=col;--top;}--top;}
}

强连通分量(strongly connected components)相关推荐

  1. 图论学习六之Strongly connected components强连通分量

    强连通分量(Strongly connected cmponents) • 在有向图G中,如果任意两个不同的顶点相互可达,则称该有向   图是强连通的.有向图G的极大强连通子图称为<

  2. JavaScript实现strongly Connected Components 强连通分量算法(附完整源码)

    JavaScript实现strongly Connected Components 强连通分量算法(附完整源码) Comparator.js完整源代码 LinkedListNode.js完整源代码 L ...

  3. Tarjan's strongly connected components algorithm的一些想法

    Tarjan的极大强连通子图(strongly connected components,SCC)算法基于深度优先遍历(DFS)实现.本文就尝试从深度优先遍历的角度思考一下Tarjan的方法是如何找出 ...

  4. FDS-HW11 6-1 Strongly Connected Components

    Strongly Connected Components 堆栈C语言实现:https://www.cnblogs.com/tingshuo123/p/7090858.html 思路分析 使用tarj ...

  5. 强连通分量(SCC, Strongly Connected Components)

    强连通分量(SCC, Strongly Connected Component) 强连通分量的概念 强连通分量的应用 强连通分量的算法--Tarjan算法 强连通分量的概念 在有向图中,任意两个顶点 ...

  6. C#,图论与图算法,寻找图强连通单元(Strongly Connected Components)的罗伯特·塔扬(Robert Tarjan‘s Algorithm)算法与源程序

    Tarjan算法是一种高效的图算法,它利用图的深度优先搜索遍历,在线性时间内找到有向图中的强连通分量.使用的关键思想是,强连通组件的节点在图的DFS生成树中形成子树. 将有向图划分为强连通分量的任务非 ...

  7. 6-10 Strongly Connected Components(30 分)

    为了便于测试也写了ReadG() 自己测试没问题,但目前仍无法通过测试样例 怀疑是结构体指针的分配与题目用意不符, 另外孤立点的输入格式不明 Tarjan算法参考修改自: http://blog.cs ...

  8. [PTA] Strongly Connected Components

    算法参考了网上资料(Tarjan算法),嫌麻烦并没有使用给出的函数指针. #include <stdio.h> #include <stdlib.h>#define MaxVe ...

  9. 有向图——强连通分量

    有向图的强连通分量(strongly connected components) 在有向图G中,如果两个顶点vi,vj间(vi!=vj)有一条从vi到vj的路径,同时还有一条从vj到vi的路径(顶点相 ...

最新文章

  1. 2022-2028年中国超声波探伤仪行业市场现状调研及发展前景分析报告
  2. poj1419(最大独立集)
  3. java queue 线程安全_java并发编程之线程安全方法
  4. rsyslog服务日志报错分析1
  5. yii2 引入php文件,Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
  6. vjue 点击发送邮件如何处理
  7. /etc/profile
  8. 利用定时器中断方式控制led灯的闪烁速度_实验四 LED点阵
  9. VC通过函数索引调用DLL范例
  10. 谢菲尔德大学的MATLAB遗传算法工具箱(附代码文件)
  11. WPS OFFICE
  12. Android Studio 手动创建活动(Activity) 第一行代码 第二章
  13. python学习笔记 Counter()
  14. python display方法_Python display.Image方法代码示例
  15. GoogleVoice群发WhatsApp翻译谷歌语音消息自动群发
  16. 重磅!2022国家杰青,硕博校友统计出炉
  17. Exception(一)
  18. 《Android移动应用基础教程》之保存QQ账号和密码
  19. python每次读取2行,如何在python中分别读取两行
  20. ksweb如何安装php5.6_KSWEB在手机上搭建php+mysql环境

热门文章

  1. 【华人学者风采】夏幼南 乔治亚理工学院
  2. 【leveldb】Compact(二 十 二):Major Compaction-Compaction的封装
  3. 安利这几个制作Excel表格的技巧
  4. 德育php,华苑小学德育教育平台的设计与实现(PHP,MySQL)(含录像)
  5. 用户账户里面没有计算机管理员,我电脑用户账户受限,电脑管理员用户不见了...
  6. gmt转换北京时间 java_GMT时间与北京时间的转换
  7. DTC的解析与状态掩码
  8. (数据库)数据库分类
  9. 系列TCP/IP协议-ping与traceroute命令(006)
  10. Labview linux 2020 Ful版本入门到入土