强连通性:如果有向图中的任意两顶点互相可到达,则该图是强连通的。
有向图强连通性的概念和性质:
1.称有向图G =(V , E) 顶点v ,w∈V是等价的, 要么v = w; 要么从 v 到 w 有一条有向路 ,并且从 w 到 v 也有一条有向路2.设 Ei(1≤i≤r) 是头、 尾均在Vi 中的边集, 则Gi =(Vi, Ei ) 称为 G的一个强连通分量, 简称强分量、强支。
3.对于有向图, 在其每一个强连通分量中, 任何两个顶点都是可达的。 vG,与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算法。
本文介绍了有向图的强连通性定义及性质,详细解释了强连通分量的概念,并提供了求解强连通分量的Korasaju算法实现。此外,还对比了Tarjan算法和Gabow算法。
1797

被折叠的 条评论
为什么被折叠?



