- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
求强连通分量的几种算法的实现与分析
摘要:有向图的强连通性是图论中的经典问题,有着很多重要的应用。该文给出了求强连通分量的Kosaraju、Tarjan和Gabow三个算法的具体实现,并对算法的效率进行了分析。
关键词:强连通分量;深度优先搜索;Kosaraju算法;Tarjan算法;Gabow算法
中图分类号:TP312文献标识码:A文章编号:1009-3044(2011)09-2140-03
The Implementation and Analysis of Several Algorithms About Strongly Connected Components
CHEN Yan1, JIANG Ke-qin2
(1.Nanjing Health Inspection Bureau, Nanjing 210003, China; 2.School of Computer and Information, Anqing Teachers College, Anqing 246011, China)
Abstract: Digraph of strong connectivity is the classic problems in graph theory, which arises in many important applications. In this paper, the detailed implementation of Kosaraju, Tarjan and Gabow algorithms is discussed for solving strongly connected components, and the efficiency of three algorithms is analyzed.
Key words: strongly connected components; depth first search; Kosaraju; Tarjan; Gabow
图的连通性是图论中的经典问题,所谓连通性,直观地讲,就是“连成一片”。无向图的连通分量的计算比较容易实现,可以通过对该无向图进行深度优先搜索或广度优先搜索,得到其中的各个连通分量的顶点集。但对有向图的强连通分量的计算,则比较麻烦,“离散数学”、“数据结构”等课程中也没有详述。在一些ACM竞赛题中,往往最后是将问题转化为求有向图的强连通分量,另外在2-SAT问题[1]的求解中也用到强连通分量的计算。
强连通分量的计算通常有三种算法:Kosaraju算法、Tarjan算法和Gabow算法。下面分别给出这三种算法的原理及其实现。
1 有向图的强连通分量及其计算
1.1 有向图的强连通性
设G为有向图,若G中存在一条以 u为起点 v为终点的有向路P,则称从 u到 v是可达的。如果G的任何两个顶点都是相互可达的 ,则称图G是强连通的[2]。所谓强连通分量(Strongly Connected Components),指的是图中的极大强连通子图。如果有向图G中只有唯一一个强连通分量,那么G是强连通图。若有向图G的强连通分量数大于1,则G为非强连通图。
图1的有向图G是非强连通图,它有三个强连通分量,如图2所示。
1.2 Kosaraju算法
Kosaraju算法[3]是基于对有向图及其逆图进行两次深度优先搜索的算法。首先从某个顶点出发沿以该顶点为尾的弧进行深度优先搜索遍历,并按其所有邻接点的搜索都完成(即退出DFS函数)的顺序将顶点排列起来,为此在退出DFS函数之前将完成搜索的顶点号记录在辅助数组finished中;接着从最后完成搜索的顶点(即最后存入finished数组的顶点)出发,沿着以该顶点为头的弧作逆向深度优先搜索遍历,若此次遍历不能访问到有向图中所有顶点,则从余下的顶点中最后完成搜索的那个顶点出发,继续作逆向深度优先搜索遍历,直至有向图中所有顶点都被访问到为止。这样,每一次作逆向深度优先搜索遍历所访问到的顶点集就是有向图的一个强连通分量的顶点集。
为了方便进行两次正向和逆向的深度优先搜索,这里采用十字链表作为有向图的存储结构,建立有向图的算法参见“数据结构”教材[4]的算法7.3。
Kosaraju算法的实现如下(分别调用DFSTraverse1_1(G)和DFSTraverse1_2(G)):
void DFS1_1(OLGraph G,int i)
{visited[i]=TRUE; // 访问标志数组置1(已被访问)
p=G.xlist[i].firstout; // p指向以i为弧尾的第一个顶点
您可能关注的文档
- 浅谈如何教好计算机基础课程.doc
- 浅谈如何利用AJAX技术改进在线考试系统.doc
- 浅谈如何利用Google高效搜索.doc
- 浅谈如何利用moho制作二维人物运动动画.doc
- 浅谈如何利用RSA算法进行数字签名.doc
- 浅谈如何让中职学生有效学习《数字非线性编辑》课程.doc
- 浅谈如何提高数据库系统实验教学质量.doc
- 浅谈如何提升多媒体教学的质量.doc
- 浅谈如何有效引导与管理好高校学生网站.doc
- 浅谈如何制作网站首页客服弹出QQ对话框.doc
- springboot基于Java的旅游民宿网络营销系统的设计与开发-论文13000字.doc
- 基于Java医院药品管理系统的设计与实现-开题报告.doc
- 基于springboot+vue的家乡特色旅游宣传推荐系统-论文15000字.docx
- springboot基于JAVA的情绪宣泄平台的设计与实现-论文16000字.docx
- springboot基于SpringBoot+Vue的旅游信息咨询网站的设计与实现-论文.docx
- 基于springboot的会议室预订系统设计与实现-论文12000字.docx
- 基于Spring Boot的学生社团管理系统的设计与实现-论文14000字.docx
- 基于Java的流浪宠物领养平台设计与实现-论文15000字.docx
- 基于 CDIO 的工科专业课程教学模式重构与实践研究开题报告.docx
- 基于 C51 单片机的波形发生器课程设计(C 语言实现).docx
文档评论(0)