利用python实现Kosaraju's算法
时间: 2023-07-26 12:40:18 浏览: 147
基于Python算法实现
Kosaraju's算法是一种用于查找强连通分量的图算法。以下是利用Python实现Kosaraju's算法的代码示例:
```python
from collections import defaultdict
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = defaultdict(list)
def addEdge(self, u, v):
self.graph[u].append(v)
def DFS(self, v, visited, stack):
visited[v] = True
for i in self.graph[v]:
if visited[i] == False:
self.DFS(i, visited, stack)
stack = stack.append(v)
def transpose(self):
g = Graph(self.V)
for i in self.graph:
for j in self.graph[i]:
g.addEdge(j, i)
return g
def SCC(self):
visited = [False] * (self.V)
stack = []
for i in range(self.V):
if visited[i] == False:
self.DFS(i, visited, stack)
gr = self.transpose()
visited = [False] * (self.V)
while stack:
i = stack.pop()
if visited[i] == False:
gr.DFS(i, visited, [])
print("")
g = Graph(5)
g.addEdge(1, 0)
g.addEdge(0, 2)
g.addEdge(2, 1)
g.addEdge(0, 3)
g.addEdge(3, 4)
print("Strongly Connected Components:")
g.SCC()
```
在上述代码中,我们定义了一个Graph类,该类包含以下方法:
- \_\_init\_\_():构造函数,初始化图中的顶点数和邻接表。
- addEdge():用于向邻接表中添加边。
- DFS():深度优先搜索算法,用于遍历图中的每个节点。
- transpose():用于反转图的邻接表。
- SCC():强连通分量算法,用于查找图中的强连通分量。
我们首先创建一个Graph对象,并向其添加边。然后,我们通过调用SCC()方法来查找图中的强连通分量。在SCC()方法中,我们首先通过调用DFS()方法来遍历图中的每个节点,并将其放入栈中。然后,我们通过反转图的邻接表来创建一个新的图,并再次使用DFS()方法来查找强连通分量。最终,我们将结果打印出来。
在上述代码中,我们使用了Python中的默认字典和列表来表示图和栈。这使得代码更加简洁和易于理解。
阅读全文