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]