如何利用深度优先实现拓扑排序于逆拓扑排序
时间: 2023-12-17 15:28:53 浏览: 111
利用深度优先搜索实现拓扑排序的步骤如下:
1. 构建图的邻接表表示。
2. 统计每个节点的入度。
3. 从入度为0的节点开始,进行深度优先搜索,并将已经访问过的节点加入结果列表中。
4. 搜索完成后,将结果列表反转即可得到拓扑排序的结果。
以下是利用深度优先搜索实现拓扑排序的Python代码示例:
```python
from collections import defaultdict
class Graph:
def __init__(self, num_vertices):
self.graph = defaultdict(list)
self.num_vertices = num_vertices
def add_edge(self, u, v):
self.graph[u].append(v)
def topological_sort_util(self, v, visited, stack):
visited[v] = True
for i in self.graph[v]:
if not visited[i]:
self.topological_sort_util(i, visited, stack)
stack.append(v)
def topological_sort(self):
visited = [False] * self.num_vertices
stack = []
for i in range(self.num_vertices):
if not visited[i]:
self.topological_sort_util(i, visited, stack)
return stack[::-1]
# 示例
g = Graph(6)
g.add_edge(5, 2)
g.add_edge(5, 0)
g.add_edge(4, 0)
g.add_edge(4, 1)
g.add_edge(2, 3)
g.add_edge(3, 1)
print("拓扑排序结果:", g.topological_sort())
```
逆拓扑排序与拓扑排序类似,只不过是将图中的边反向,然后再进行拓扑排序。以下是逆拓扑排序的Python代码示例:
```python
from collections import defaultdict
class Graph:
def __init__(self, num_vertices):
self.graph = defaultdict(list)
self.num_vertices = num_vertices
def add_edge(self, u, v):
self.graph[v].append(u)
def topological_sort_util(self, v, visited, stack):
visited[v] = True
for i in self.graph[v]:
if not visited[i]:
self.topological_sort_util(i, visited, stack)
stack.append(v)
def topological_sort(self):
visited = [False] * self.num_vertices
stack = []
for i in range(self.num_vertices):
if not visited[i]:
self.topological_sort_util(i, visited, stack)
return stack[::-1]
# 示例
g = Graph(6)
g.add_edge(2, 5)
g.add_edge(0, 5)
g.add_edge(0, 4)
g.add_edge(1, 4)
g.add_edge(3, 2)
g.add_edge(1, 3)
print("逆拓扑排序结果:", g.topological_sort())
```
阅读全文