求强连通分量的几种算法的实现与分析.docVIP

求强连通分量的几种算法的实现与分析.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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为弧尾的第一个顶点

文档评论(0)

heroliuguan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8073070133000003

1亿VIP精品文档

相关文档