目录
前言
A.建议
1.学习算法最重要的是理解算法的每一步,而不是记住算法。
2.建议读者学习算法的时候,自己手动一步一步地运行算法。
B.简介
Kosaraju算法是用来寻找有向图的强连通分量的一种线性时间复杂度算法。
一 代码实现
以下是用C语言实现Kosaraju算法的基本思路概述:
Kosaraju算法步骤概览:
第一步(DFS在原始图G中):
对图G进行深度优先搜索(DFS),记录每个顶点的完成次序(LIFO顺序,即后进先出顺序)。
void dfs1(Graph G, int u, bool visited[], stack<int>& order) {
visited[u] = true;
for (each neighbor v of u in G) {
if (!visited[v]) {
dfs1(G, v, visited, order);
}
}
order.push(u); // 将顶点u按完成次序压入栈中
}
stack<int> getOrder(Graph G) {
bool visited[n]; // n为顶点数
memset(visited, false, sizeof(visited));
stack<int> order;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
dfs1(G, i, visited, order);
}
}
return order;
}
第二步(DFS在逆图GT中,按照第一步得到的顺序):
构建原图G的逆图GT,然后按照第一步得到的顶点完成次序,依次从栈中取出顶点并对逆图GT进行DFS,每次DFS结束时,当前遍历到的所有顶点构成一个强连通分量。
void dfs2(Graph GT, int u, bool visited[], set<int>& component) {
visi