Kosaraju 算法实现

1.用c++写了算法课的作业,计算了875714个顶点的有向图,计算了前5个最大连通分量的个数,用了两次DFS算法。
2.用c++开辟大数组容易出segment fault,后来改用堆开辟。图的邻接表用了链表表示。
VertexNode* adjList = new VertexNode[875714];
3.Kosaraju算法流程不在此详述。

深度优先搜索

1递归实现

伪代码如下:
输入:有向图:G=(V,E),邻接链表表示,和某个顶点vi
1. 将顶点vi标记为已经访问。
2. 对于每条边(i,j)G:
{
如果存在某个顶点vj未被访问,则对顶点vj进行访问:
DFS(G,j)
}
代码如下:
图处理算法-Kosaraju's-算法

2.非递归实现

非递归实现要用到栈。
输入:有向图:G=(V,E),邻接链表表示,和某个顶点vi.
1.栈初始化,将顶点vi入栈,并标记为已访问。
2.while(栈非空)
x = 栈顶元素
a.对于每条边(x,j)G:
if.如果存在某个顶点vj未被访问:
{
.将vj标记为已访问
.将顶点vj入栈。
break;
}
else
X出栈.
代码如下:
图处理算法-Kosaraju's-算法

图的表示

第一次用二维vector向量存,速度很慢,后来改用链表。

顶点表

图处理算法-Kosaraju's-算法

边表

图处理算法-Kosaraju's-算法
完整代码有兴趣的可以读:
https://github.com/Shinered/Kosaraju/blob/master/dfs3.cpp

相关文章:

  • 2021-08-06
  • 2021-07-07
  • 2022-01-23
  • 2021-06-13
  • 2021-12-06
  • 2022-12-23
  • 2021-08-13
猜你喜欢
  • 2021-09-20
  • 2021-10-17
  • 2022-01-09
  • 2021-06-09
  • 2021-11-22
  • 2021-08-23
  • 2021-12-07
相关资源
相似解决方案