📅  最后修改于: 2023-12-03 15:12:38.119000             🧑  作者: Mango
题目链接: https://www.geeksforgeeks.org/gate-cs-mock-2018-set-2-question-40/
给定一个有向无环图(DAG)和它的一条路径,计算在这条路径上有多少个点。
输出路径上的节点数。
5 6
1 2
2 3
3 4
1 4
2 4
2 5
1 4
3
本题的思路是基于拓扑排序的。首先,需要先对DAG进行拓扑序的排序,然后扫描这条路径上的所有节点,找到它们的位置在拓扑序数组中对应的下标,最后两个下标之间的差距就是这条路径上的节点数。
def topsort(graph):
n = len(graph)
in_degrees = [0] * n
for _, v in graph:
in_degrees[v] += 1
queue = [i for i in range(n) if in_degrees[i] == 0]
topo_order = []
while queue:
node = queue.pop(0)
topo_order.append(node)
for u, v in graph:
if u == node:
in_degrees[v] -= 1
if in_degrees[v] == 0:
queue.append(v)
return topo_order
n, m = map(int, input().split())
graph = []
for i in range(m):
u, v = map(int, input().split())
graph.append((u-1, v-1))
s, t = map(int, input().split())
# 对DAG进行拓扑排序
topo_order = topsort(graph)
# 获取s和t在topo_order中对应的下标
s, t = s-1, t-1
s_idx, t_idx = topo_order.index(s), topo_order.index(t)
# 计算路径上的节点数
path_len = t_idx - s_idx + 1
print(path_len)
时间复杂度: $O(n + m)$, 其中n和m分别是DAG的节点数和边数。