码迷,mamicode.com
首页 > 其他好文 > 详细

?数据结构-图之强连通

时间:2015-06-26 06:59:34      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:

数据结构-图之强连通

在一个无向G中,若从v_iv_j有路径相(当然从v_jv_i也一定有路径),v_iv_j的。如果G有向,那么v_iv_j的路径中所有的都必同向。如果中任意两点都是的,那么被称作通性是的基本性

通分量:无向G的一个通子G的一个通分量(或通分支)。只有一个通分量,即其自身;非通的无向有多个通分量。

通路:通路中所有的点互不相同。初通路必为简单通路,但反之不真。

强连有向G= (V,E)中,若V中任意两个不同的xy,都存在xy以及从yx的路径G强连Strongly Connected Graph)。相地有强连通分量(Strongly Connected Component)的概念。强连只有一个强连通分量,即是其自身;非强连通的有向有多个强连通分量。

强连指每一个点皆可以该图上的抵达其他的每一个点的有向。意即于此上每一个点(Va,Vb),皆存在路径VaVb以及VbVa强连通分量是指一有向 G 的极大强连通子 G‘。如果将每一个强连通分量成一个点, G 将会成一有向无环图。一张图被称有向无环图当且当此不具有点集合数量大于一的强连通分量,因有向即是一个强连通分量,而且任何的强连通分量皆具有至少一个有向

Kosaraju算法、Tarjan算法、Gabow算法皆为寻找有向图强连通分量的有效算法。但是由于在Tarjan 算法和 Gabow 算法的程中,只需要行一次的深度先搜索,因而相 Kosaraju 算法有效率。

强连通分量的算法,也可以用来解 2-SAT(2-satisfiability) 问题。Aspvall, Plass & Tarjan (1979)

根据 Robbins当一个无向图为图时,也会形成强连strong connectivity

由于强连通分量的特殊性,在一些实际应用中,会将每个强连通分量看成一个点,然后理。这样做主要是了降低的复度,特是在强连通分量模大、数量多的情况中,利用“点”能大幅度降低的复度。点后得到的,必定是DAG

将一个大图分解成多个连通分量,某些有向图算法可以分别在各个连通分量上独立运行,最后再根据分量之间的关系将所有的解组合起来。

(青玉案 元夕 [辛弃疾]

东风夜放花千树,更吹落星如雨。宝马雕车香满路,凤箫声动,玉壶光转,一夜鱼龙舞。

蛾儿雪柳黄金缕,笑语盈盈暗香去。众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。)

 

Kosaraju算法1978

Kosaraju的算法(也称Kosaraju-Sharir算法)是线时间的算法来找到一个有向强连通分量。Aho, Hopcroft Ullman相信个算法是由S. Rao Kosaraju1978在一个未表的文上提出的。相同的算法Micha Sharir 1981年自己出版的上被独的发现个算法利用了一个事,即(同中的每的方向相反)具有和原完全一强连通分量。

图,既逆图,是新创建的图,其每条边都与原图边的方向相反。

Kosaraju算法了找到强连通分量,首先对图G运行DFS算出各点完成搜索的时间f;然后的逆GTGTDFS搜索,但是里搜索时顶点的访问次序不是按照号的大小,而是按照各f由大到小的序;逆DFS所得到的森林即对应连通区域。

上面我提及原G的逆GT,其定义为GT=(V,ET)ET={(u,v):(v,u)E}}。也就是GT是由G中的反向所成的,通常也称之为图G置。在得一提的是,逆GT和原G有着完全相同的通分支,也就,如果stG中是互达的,当且stGT中也是互达的。

1、对G行深度先遍记录每个点的离开时间num[i]

2、求得原图的逆图GT

3、选择具有最晚离开时间点,GT行遍除能到的点,点构成一个强连通分量

4如果点没有除,继续3,否算法.

Kosaraju算法的流程简单,但是需要对图(和逆图)进行两次DFS搜索,而且读逆图的DFS搜索中顶点的访问顺序有特定的限制。

 

Tarjan算法

Tarjan算法 (以发现Robert Tarjan命名)是一个在强连通分量的算法。时间更早,它仍可以被视为Kosaraju算法的一个改。它的效率跟Gabow算法差不多。

此算法以一个有向为输入,并按照所在的强连通分量出其点集的一个划分。中的每个点只在一个强连通分量中出,即使是在有些独构成一个强连通分量的情况下(比如中出构或孤立点)。

Tarjan基于递归实现的深度优先搜索,在搜索过程中将顶点不断压入堆栈中,并在回溯时判断堆栈中顶点是否在同一联通分支。函数借助两个辅助数组prelow,其中pre[u]为顶点u搜索的次序编号,low[u]为顶点u能回溯到的最早的顶点的次序编号。当pre[u]=low[u]时,则弹出栈中顶点并构成一个连通分支。Tarjan算法可以在线性时间内找出一个有向图的强分量,并且对原图进行一次DFS即可。

具体如下:任点开始行深度先搜索(若深度先搜索束后仍有未访问点,再从中任一点再次行)。搜索程中已访问点不再访问。搜索的若干子构成了强连通分量。

点按照被访问序存入中。从搜索的子返回至一个检查该结点是否是某一强连通分量的根点(下)并将其从除。如果某点是强连通分量的根,在它之前出不属于其他强连通分量的点构成了该结点所在的强连通分量。

点的性

算法的关在于如何判定某点是否是强连通分量的根。注意“强连通分量的根”仅针对此算法,事强连通分量是没有特定的“根”的。在里根点指深度先搜索时强连通分量中首个被访问点。

找到根点,我们给每个v一个深度先搜索v.index,表示它是第几个被访问点。此外,每个v有一个v.lowlink,表示从v发经有向可到达的所有点中最小的indexv.lowlink是不大于v.index,且当从v发经有向不能到达其他两个相等。v.lowlink在深度先搜索的程中求得,v强连通分量的根当且v.lowlink = v.index

 

Gabow算法

Gabow算法是Tarjan算法的提升版本,该算法类似于Tarjan算法。算法维护了一个顶点栈,但是还是用了第二个栈来确定何时从第一个栈中弹出各个强分支中的顶点,它的功能类似于Tarjan算法中的数组low。从起始顶点w处开始进行DFS过程中,当一条回路显示这组顶点都属于同一个强连通分支时,就会弹出栈二中顶点,只留下回边的目的顶点,也即搜索的起点w

当回溯到递归起始顶点w时,如果此时该顶点在栈二顶部,则说明该顶点是一个强联通分量的起始顶点,那么在该顶点之后搜索的顶点都属于同一个强连通分支。于是,从第一个栈中弹出这些点,形成一个强连通分支。


?数据结构-图之强连通

标签:

原文地址:http://my.oschina.net/u/660460/blog/470964

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!