有向图(6)--计算强连通分量的Kosaraju算法

本文详细介绍了Kosaraju算法,该算法用于找出有向图中的强连通分量。首先,通过深度优先搜索计算反向图的逆后序排列;然后,按照此顺序在原图上进行深度优先搜索,同一递归DFS调用中的顶点属于同一强连通分量。附带了`main.cpp`测试用例以验证算法的正确性。
摘要由CSDN通过智能技术生成

Kosaraju算法

1.在给定的一幅有向图G中,使用DepthFirstOrder来计算他的反向图R的逆后序排列

2.在G中进行标准的深度优先搜索,但是要按照刚才计算得到的顺序而非标准的顺序来访问所有未被标记的顶点

3.在构造函数中,所有在同一个递归dfs()调用中被访问到的顶点都在同一个强连通分量

#ifndef __KOSARAJU_SCC_H__
#define __KOSARAJU_SCC_H__

#include "Digraph.h"
#include "DepthFirstOrder.h"

class KosarajuSCC {
private:
	bool* marked;		// 已经访问过的顶点
	int* id;			// 强连通分量的标识符
	int count;			// 强连通分量的个数

public:
	KosarajuSCC(Digraph G);
	~KosarajuSCC() { delete[] marked; delete[] id; }

	bool stronglyConnected(int v, int w)const { return id[v] == id[w]; }
	int getId(int v)const { return id[v]; }
	int getCount()const { return count; }

private:
	void dfs(Digraph G, int v);
};

KosarajuSCC::KosarajuSCC(Digraph G) {
	count = 0;
	int vNum = G.getV();
	marked = new bool[vNum];
	id = new int[vNum];
	for (int i = 0; i < vNum; ++i) {
		marked[i] = false;
		id[i] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值