/*
有向图的强连通分支:
算法思想:
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 正常图中,我们采用一个连通计数器来记录不同节点所处不同的连通分量重
//设置连通分量计数器
g_iBranchNumArr[u] = g_iBranchCount;
for(int k = 0 ; k < n ; k++)
{
//如果&l