- 2
- 0
- 约7.84千字
- 约 13页
- 2019-07-12 发布于浙江
- 举报
?
\o 有向图的强连通分量 有向图的强连通分量
分类:? C/C++程序设计2009-04-15 16:50?2341人阅读? 评论(1)? \o 收藏 收藏? \o 举报 举报
最关键通用部分:强连通分量一定是图的深搜树的一个子树。
?
一、?????Kosaraju算法
1.??????算法思路
基本思路:
这个算法可以说是最容易理解,最通用的算法,其比较关键的部分是同时应用了原图G和反图GT。(步骤1)先用对原图G进行深搜形成森林(树),(步骤2)然后任选一棵树对其进行深搜(注意这次深搜节点A能往子节点B走的要求是EAB存在于反图GT),能遍历到的顶点就是一个强连通分量。余下部分和原来的森林一起组成一个新的森林,继续步骤2直到 没有顶点为止。7
改进思路:
当然,基本思路实现起来是比较麻烦的(因为步骤2每次对一棵树进行深搜时,可能深搜到其他树上去,这是不允许的,强连通分量只能存在单棵树中(由开篇第一句话可知)),我们当然不这么做,我们可以巧妙的选择第二深搜选择的树的顺序,使其不可能深搜到其他树上去。想象一下,如果步骤2是从森林里选择树,那么哪个树是不连通(对于GT来说)到其他树上的呢?就是最后遍历出来的树,它的根节点在步骤1的遍历中离开时间最晚,而且可知它也是该树中离开时间最晚的那个节点。这给我们提供了很好的选择,在第一次深搜遍历时,记录时间i离开的顶点j,即numb[i]=j。那么,我们每次只需找到没有找过的顶点中具有最晚离开时间的顶点直接深搜(对于GT来说)就可以了。每次深搜都得到一个强连通分量。?
隐藏性质:
????分 析到这里,我们已经知道怎么求强连通分量了。但是,大家有没有注意到我们在第二次深搜选择树的顺序有一个特点呢?如果在看上述思路的时候,你的脑子在思 考,相信你已经知道了!!!它就是:如果我们把求出来的每个强连通分量收缩成一个点,并且用求出每个强连通分量的顺序来标记收缩后的节点,那么这个顺序其 实就是强连通分量收缩成点后形成的有向无环图的拓扑序列。为什么呢?首先,应该明确搜索后的图一定是有向无环图呢?废话,如果还有环,那么环上的顶点对应 的所有原来图上的顶点构成一个强连通分量,而不是构成环上那么多点对应的独自的强连通分量了。然后就是为什么是拓扑序列,我们在改进分析的时候,不是先选 的树不会连通到其他树上(对于反图GT来说),也就是后选的树没有连通到先选的树,也即先出现的强连通分量收缩的点只能指向后出现的强连通分量收缩的点。那么拓扑序列不是理所当然的吗?这就是Kosaraju算法的一个隐藏性质。?
2.??????伪代码
Kosaraju_Algorithm:
?step1:对原图G进行深度优先遍历,记录每个节点的离开时间。
?step2:选择具有最晚离开时间的顶点,对反图GT进行遍历,删除能够遍历到的顶点,这些顶点构成一个强连通分量。
?step3:如果还有顶点没有删除,继续step2,否则算法结束。?
3.??????实现代码:
#include?iostream
using?namespace?std;
?
const?int?MAXN = 110;
?
typedef?int?AdjTable[MAXN];?//邻接表类型
?
int??????n;
bool?????flag[MAXN];?//访问标志数组
int??????belg[MAXN];?//存储强连通分量,其中belg[i]表示顶点i属于第belg[i]个强连通分量
int??????numb[MAXN];?//结束时间标记,其中numb[i]表示离开时间为i的顶点
AdjTable adj[MAXN], radj[MAXN];?//邻接表,逆邻接表
?
//用于第一次深搜,求得numb[1..n]的值
void?VisitOne(int?cur,?int?sig)
{
??flag[cur] =?true;
?
??for?(?int?i=1; i=adj[cur][0]; ++i )
??{
?????if?(?false==flag[adj[cur][i]] )
?????{
?????????VisitOne(adj[cur][i],sig);
?????}
??}
?
??numb[++sig] = cur;
}
?
//用于第二次深搜,求得belg[1..n]的值
void?VisitTwo(int?cur,?int?sig)
{
??flag[cur] =?true;
??belg[cur] = sig;
?
??for?(?int?i=1; i=radj[cur][0]; ++i )
??{
?????if?(?false==flag[radj[cur][i]] )
?????{
?????????Vi
您可能关注的文档
- 语段修改专项训练.doc
- 长方体和正方体提高练习题.doc
- 语法——并列句和状语从句.doc
- 长方体和正方体体积测试题.doc
- 语法复习--特殊句式(主谓一致).doc
- 长方体和正方体体积教案、反思.doc
- 有偿补课专项整治自查报告.doc
- 语法讲解-时间状语从句的用法解析及练习.docx
- 语法填空和短文改错--介词.docx
- 语法填空中形容词、副词.docx
- 河北盐山中学等校2025-2026学年上学期高三一模化学试卷(含解析).docx
- 河北正定中学2025-2026学年高一上学期期末考试物理试卷(含解析).docx
- 河北张家口市怀安县2025-2026学年第一学期期末教学综合评价八年级地理试卷(含解析).docx
- 河南安阳市殷都区2025-2026学年第一学期期末教学质量检测七年级地理试卷(含解析).docx
- 河南安阳市滑县2025一2026学年第一学期期末学业质量监测八年级地理试题(含解析).docx
- 河南安阳市林州市2025-2026学年上学期期末考试高一政治试题(含解析).docx
- 河南焦作市武陟县第一中学2025-2026学年高一上学期1月月考语文试卷(含解析).docx
- 河南济源市2025-2026学年上学期期末学业质量调研七年级历史试卷(含解析).docx
- PICC导管并发症的紧急处理与护理.pptx
- 河南鹤壁市2025-2026学年高二上学期期末考试生物试题(含解析).docx
原创力文档

文档评论(0)