给出计算图中强连通分量的Kosaraju算法代码
时间: 2023-02-09 13:15:58 浏览: 123
Kosaraju算法是一种用于求解计算图中强连通分量的算法。它的基本思想是使用两次深度优先搜索,第一次搜索是从每个顶点出发,第二次搜索是从逆后续图中的每个顶点出发。
下面是Kosaraju算法的代码实现:
```python
# adj_list为邻接表存储的图
def kosaraju(adj_list):
# 首先求出逆后续图
rev_adj_list = reverse_graph(adj_list)
# 初始化visited数组
visited = [False for _ in range(len(adj_list))]
# 初始化空栈
stack = []
# 首先遍历图,求出每个点的后续
for i in range(len(adj_list)):
if not visited[i]:
dfs(i, adj_list, visited, stack)
# 清空visited数组
visited = [False for _ in range(len(adj_list))]
# 强连通分量列表
scc = []
# 开始遍历逆后续图
while stack:
i = stack.pop()
if not visited[i]:
component = []
dfs(i, rev_adj_list, visited, component)
scc.append(component)
return scc
def reverse_graph(adj_list):
rev_adj_list = [[] for _ in range(len(adj_list))]
for i, adj in enumerate(adj_list):
for j in adj:
rev_adj_list[j].append(i)
return rev_adj_list
def dfs(v, adj_list, visited, stack):
visited[v] = True
for i in adj_list[v]:
if not visited[i]:
dfs(i, adj_list, visited, stack)
stack.append(v)
```
这里需要注意的是,该算法求出的强连通分量是逆后续图中的组件,而不是原图中的组件。
阅读全文