Skip to content

Commit 60742f0

Browse files
author
邹昊晟(Haosheng.Z)
committed
拓扑排序自己习惯的记忆模板
1 parent 67465de commit 60742f0

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

basic_algorithm/graph/topological_sorting.md

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,35 @@
88
99
非常经典的拓扑排序应用。下面给出 4 种实现方法,可以当做模板使用。
1010

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+
1240

1341
> 建图 --> deque当前0度点 --> 出0度点,减度,入新0度点 --> 依长度判断有无环。
1442

0 commit comments

Comments
 (0)