算法设计与分析:第六章 图 6.2求有向图的强连通分支

本文介绍了一种求有向图强连通分支的算法,通过深度优先搜索进行逆序和正向遍历。首先对逆图进行后序遍历,然后反转逆图的边,最后统计连通分支数。算法使用邻接矩阵实现,并提供了C++代码示例。
摘要由CSDN通过智能技术生成
/*
有向图的强连通分支:
算法思想:
1对图G进行深度优先搜索,求出每个顶点的后续遍历序号postn
2反转图G中的边,构造一个新的有向图G*
3第2步中产生的森林中的每一颗数,对应一个强连通分支

真正算法实现:
1对逆图G进行后序遍历
2反转逆图G中的边
3将统计连通分支数

采用邻接矩阵实现
输入
6
0 1 1 0 0 0
0 0 0 1 0 0
0 0 0 1 1 0
1 0 0 0 0 1
0 0 0 0 0 1
0 0 0 0 0 0
输出:
3

对逆图后序编号
算法过程:
1初始化变量
2计算逆后序,通过访问标记来实现有无访问过。通过前序与后序两个来
标记,而且后序的生成是不需要if条件的,因为他必须生成
3清空前序计数器,设定每个点的强联通分量为-1
4第二次dfs不再根据访问标记决定是否递归,而是根据当前结点的强连通分量
5递归的条件必须同时满足两结点连接和该结点的连通分量不为初始值
*/

/*
关键:
1 采用先逆序图的后序->原图的后序从高到低的次序做

2 先逆序图的后序中,注意由于是邻接矩阵,只需将<u,k>变成对<k,u>的判断即可,判断包含:是否访问+两点是否连接这两个条件
	//置已经访问标记
	g_iVisitArr[u] = 1;
	for(int k = 0 ; k < n ; k++)
	{
		//如果顶点k没有被访问过且<k,u>是一条边,本来是g_r[u][k]
		if(!g_iVisitArr[k] && g_iMatrix[k][u] == 1)
		{
			dfsPost(k,n);
		}
	}
	//注意不管条件如何,每次进入的点都需要加入到后序结点数组中
	g_vecPost.push_back(u);
3 正
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值