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

本文介绍了有向图的强连通性定义及性质,详细解释了强连通分量的概念,并提供了求解强连通分量的Korasaju算法实现。此外,还对比了Tarjan算法和Gabow算法。

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


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

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算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值