拓扑排序类 待优化
拓扑排序是针对于有向无环图的一种排序。所以如果一个有向图可以拓扑排序那么他一定是有向无环图。拓扑排序满足一下两个条件:
- 每个顶点出现且只出现一次。
- 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。
注意:拓扑排序不唯一;有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。
拓扑排序的思想
- 找到入度为0的点,加入序列,删除改点和改点对应的边,更新各点入度。
- 重复上诉步骤直到不存在节点。如果存在节点,却不存在入度为0的点,那么不存在拓扑排序。
拓扑排序结果为:{ 1, 2, 4, 3, 5 }。
代码
基于python的实现,默认输入G是边的集和。
如:`
n = 4,
g = [[1,0],[2,0],[3,1],[3,2]]
代表0到1 有边,0到2有边,1到3有边,2到3右边
from collections import deque
class TopologiocalSort:
def __init__(self,n_node,G):
"""
:type n_node: int
:type G: List[List[int]]
"""
self.node_num = n_node
self.graph = G
def sort(self):
self.indegrees = [0 for _ in range(self.node_num)]
self.adjacency = [[] for _ in range(self.node_num)]
queue = deque()
top_sort_ans = []
# init
for cur,pre in self.graph:
self.indegrees[cur]+=1
self.adjacency[pre].append(cur)
# Get all the node with indegree of 0
for i in range(len(self.indegrees)):
if not self.indegrees[i]:queue.append(i)
# BFS Top sort
while queue:
pre = queue.popleft()
top_sort_ans.append(pre)
self.node_num-=1
for cur in self.adjacency[pre]:
self.indegrees[cur]-=1
if not self.indegrees[cur]:queue.append(cur)
return top_sort_ans if not self.node_num else []
时间复杂度 O(N + M)O(N+M): 遍历一个图需要访问所有节点和所有临 边,NN 和 MM 分别为节点数量和临边数量;
空间复杂度 O(N + M)O(N+M): 为建立邻接表所需额外空间,adjacency 长度为 NN ,并存储 MM 条临边的数据
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。