⚠️ 拓扑排序一共做了多少次减法
七个构建任务编号 0~6,(a, b) 表示 a 做完才能做 b:数一数 kahn 里"入度减 1"这个动作在两张图上各做了多少次——左边是那张 DAG,右边是加了 5 → 3 的那张:
DEP = [(0, 1), (0, 2), (1, 3), (2, 3), (3, 4), (4, 5), (4, 6)]
G = [(0, 1), (0, 2), (1, 3), (2, 3), (3, 4), (4, 5), (5, 3), (4, 6)]
N = 7
def kahn_cost(edges):
g = {u: [] for u in range(N)}
d = {u: 0 for u in range(N)}
for a, b in edges:
g[a].append(b)
d[b] += 1
ready = sorted(u for u in range(N) if d[u] == 0)
steps = 0
while ready:
u = ready.pop(0)
for v in g[u]:
d[v] -= 1
steps += 1
if d[v] == 0:
ready.append(v)
ready.sort()
return steps
print(str(kahn_cost(DEP)) + "/" + str(kahn_cost(G)))
全部评论