图的强连通性:Korasaju算法实现

来源:互联网 发布:诺基亚java下载专区 编辑:程序博客网 时间:2024/05/29 02:18

强连通性:如果有向图中的任意两顶点互相可到达,则该图是强连通的。


有向图强连通性的概念和性质:

1.称有向图G =(V , E) 顶点v  ,w∈V是等价的, 要么v = w; 要么从 v 到 w 有一条有向路 ,并且从 w 到 v 也有一条有向路
2.设 Ei(1≤i≤r) 是头、 尾均在Vi 中的边集, 则Gi =(Vi, Ei ) 称为 G的一个强连通分量, 简称强分量、强支。
3.对于有向图, 在其每一个强连通分量中, 任何两个顶点都是可达的。 vG,与v可相互到达的所有顶点就是包含v的强连通分量的所有顶点
4.设从v可到达(以v为起点的所有有向路径的终点)的顶点集合为T1(G),而到达v(以v为终点的所有有向路径的起点)的顶点集合为T2(G),则包含v的强连通分量的顶点集合是:T1(G)∩T2(G) 
5.性质定理:
一个有向图是强连通的。当且仅当G中有一个回路。他至少包含每个顶点各一次。


求有向图强连通分支的算法—Korasaju算法
输入:有向图G
输出:有向图的强连通分量(森林的孩子-兄弟表示)


算法步骤:
1.深度优先遍历G(起点如何选择无所谓),并计算出每个顶点U的结束时间dfn[u];
2.深度优先遍历G的转置(反向)图GT,选择遍历起点时,按照顶点结束时间从大到小进行。遍历过程中,一边遍历,一边给顶点做分类标记,每找到一个新的起点,分类标记就加1;
3.第二步中产生的标记值相同的顶点构成深度优先森林中的一棵树,也即一个强连通分量







求有向图强连通分支的Korasaju算法实现
/* 按弧的正向搜索, 起点如何选择无所谓 */int in_order[MAX_VEX] ;void DFS(OLGraph *G int v) { ArcNode *p ;Count=0 ;visited[v]=TRUE ;for (p=G->xlist[v] .firstout ; p!=NULL ; p=p .firstout ; p!=NULL ; p=p->tlink)if (!visited[p->headvex])DFS(G p , p->headvex) ;in_order[count++]=v ;}/* 对图G按弧的逆向进行搜索 */void Rev_DFS(OLGraph *G , int v){ ArcNode *p ;visited[v]=TRUE ;printf(“%d” , v) ; /* 输出顶点 */for (p=G->xlist[v].firstin ; p!=NULL ; p=p->hlink)if (!visited[p->tailvex])Rev_DFS(G , p->tailvex) ;}void Strongly_Connected_ Component(OLGraph *G){ int k=1, v, j ;for (v=0; v<G->vexnum; v++) visited[v]=FALSE ;for (v=0; v<G->vexnum; v++) /* 对图G正向遍历 */if (!visited[v]) DFS(G, v) ;for (v=0; v<G->vexnum; v++)visited[v]=FALSE ;for (j=G->vexnum-1; j>=0; j--) { /* 对图G逆向遍历 */v=in_order[j] ;if (!visited[v]) {printf(“\n第%d个连通分量顶点:”, k++) ;Rev_DFS(G, v) ;}}}




Korasaju算法复杂度分析:

跟深度优先搜索的复杂度相同:O(|V|+|E|)。
其他求有向图强连通性的算法:
Tarjan算法(与关节点算法似)
Gabow算法。
0 0
原创粉丝点击