File tree Expand file tree Collapse file tree 1 file changed +29
-1
lines changed Expand file tree Collapse file tree 1 file changed +29
-1
lines changed Original file line number Diff line number Diff line change 8
8
9
9
非常经典的拓扑排序应用。下面给出 4 种实现方法,可以当做模板使用。
10
10
11
- 个人目前最喜欢:BFS拓扑排序,基本就是方法 3 Kahn's algorithm:
11
+ 个人目前最喜欢:BFS拓扑排序,基本就是方法 3 Kahn's algorithm,自己最习惯的记忆模板
12
+
13
+ ``` python
14
+ def topo_sort (edges ):
15
+ # 建图
16
+ g = defaultdict(list )
17
+ indegs = [0 ] * n
18
+ for u, v in edge:
19
+ g[u] = v
20
+ indegs[v] += 1
21
+
22
+ # 行数很少的排序
23
+ result = list () # 存拓扑排序的结果
24
+ indeg_0 = deque([u for u in range (n) if indegs[u] == 0 ])
25
+ # 就用list,只在末尾pop append也行
26
+ # indeg_0 = [u for u in range(n) if indegs[u] == 0]
27
+
28
+ while indeg_0:
29
+ u = indeg_0.popleft() # list就.pop()即可
30
+ result.append(u)
31
+ for v in g[u]:
32
+ indegs[v] -= 1
33
+ if indegs[v] == 0 : # 在这里立即判断是否可以入队,这样就不需要记录visited数组了,细品:已经为0的之前就入队,总是立即入队
34
+ indeg_0.append(v)
35
+
36
+ assert len (result) == n # 最后看是否都排进去了,判断是否存在拓扑排序
37
+ # 这种写法,不用visited数组,主循环不用判断是否存在,只需前后处理,最简单
38
+ ```
39
+
12
40
13
41
> 建图 --> deque当前0度点 --> 出0度点,减度,入新0度点 --> 依长度判断有无环。
14
42
You can’t perform that action at this time.
0 commit comments