设计算法求解有向无环图的所有拓扑序列,写出代码
时间: 2023-11-28 07:51:25 浏览: 82
有向无环图的全拓扑排序
拓扑排序是一种经典的计算机科学算法,可以用来解决有向无环图(DAG)的排序问题。具体的算法流程如下:
1. 选取一个入度为0的顶点,将其输出,并将所有以该顶点为起点的边(即该顶点所连接的所有顶点)的终点的入度减1。
2. 重复步骤1,直到所有顶点都被输出。
如果在执行过程中存在无法输出的顶点,则说明图中存在环,无法进行拓扑排序。
接下来是Python实现的代码:
```python
from collections import defaultdict
def topological_sort(graph):
# 初始化每个顶点的入度为0
in_degree = {v: 0 for v in graph}
# 计算每个顶点的入度
for v in graph:
for w in graph[v]:
in_degree[w] += 1
# 将所有入度为0的顶点加入队列
queue = [v for v in graph if in_degree[v] == 0]
# 依次输出队列中的顶点,并将与之相邻的顶点的入度减1
result = []
while queue:
v = queue.pop(0)
result.append(v)
for w in graph[v]:
in_degree[w] -= 1
if in_degree[w] == 0:
queue.append(w)
# 如果存在入度不为0的顶点,则说明图中存在环
if len(result) != len(graph):
return None
return result
# 示例
graph = defaultdict(list)
graph[1] = [2, 3]
graph[2] = [4]
graph[3] = [4]
graph[4] = []
print(topological_sort(graph)) # [1, 2, 3, 4]
```
在这个示例中,我们构建了一个有向无环图,包含四个顶点和三条边。程序输出了一个拓扑序列 `[1, 2, 3, 4]`,表示按照这个顺序依次处理这些顶点时不会违反边的方向性。
阅读全文