拓扑排序
TODO
from collections import deque
def loudAndRich(richer, quiet):
n = len(quiet)
g = [[] for _ in range(n)]
inDeg = [0] * n
# 构建有向图(有钱指向没钱),并且统计每个节点的入度
for r in richer:
g[r[0]].append(r[1])
inDeg[r[1]] += 1
ans = list(range(n))
# 将度为0的节点入队
q = deque(i for i, deg in enumerate(inDeg) if deg == 0)
while q:
x = q.popleft()
for y in g[x]:
# 相连接的节点将赋值较低的安静值
if quiet[ans[x]] < quiet[ans[y]]:
ans[y] = ans[x]
# 更新相邻接点的度
inDeg[y] -= 1
# 将度为0的节点入队
if inDeg[y] == 0:
q.append(y)
return ans
if __name__ == '__main__':
richer = [[1, 0], [2, 1], [3, 1], [3, 7], [4, 3], [5, 3], [6, 3]]
quiet = [3, 2, 5, 4, 6, 1, 7, 0]
print(loudAndRich(richer, quiet))