编写一个拓普排序的代码
时间: 2023-05-19 15:01:59 浏览: 182
拓扑排序代码
以下是一个基于 Kahn 算法的拓扑排序的 Python 代码:
```python
from collections import defaultdict
def topological_sort(graph):
# 计算每个节点的入度
in_degree = defaultdict(int)
for node in graph:
for neighbor in graph[node]:
in_degree[neighbor] += 1
# 将入度为 0 的节点加入队列
queue = [node for node in graph if in_degree[node] == 0]
# 依次取出队首节点,并将其邻居节点的入度减 1
result = []
while queue:
node = queue.pop(0)
result.append(node)
for neighbor in graph[node]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
# 如果存在环,则说明拓扑排序失败
if len(result) != len(graph):
raise ValueError("Graph contains a cycle")
return result
```
该代码接受一个字典类型的图作为输入,其中键表示节点,值表示该节点的邻居节点。例如,下面的图:
```
A -> B -> C
| | |
v v v
D -> E -> F
```
可以表示为:
```python
graph = {
'A': ['D'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
```
调用 `topological_sort(graph)` 将返回一个拓扑排序后的节点列表,例如:
```python
>>> topological_sort(graph)
['A', 'B', 'D', 'E', 'C', 'F']
```
注意,该代码假设输入的图是有向无环图(DAG),如果存在环,则会抛出 `ValueError` 异常。
阅读全文