📜  门| GATE CS Mock 2018 |设置 2 |第 40 题(1)

📅  最后修改于: 2023-12-03 15:12:38.119000             🧑  作者: Mango

门| GATE CS Mock 2018 |设置 2 |第 40 题

题目链接: https://www.geeksforgeeks.org/gate-cs-mock-2018-set-2-question-40/

题目描述

给定一个有向无环图(DAG)和它的一条路径,计算在这条路径上有多少个点。

输入格式
  • 第一行包含两个正整数N和M,分别表示图中的节点数和边数。
  • 接下来M行表示DAG的边。每行有两个整数u和v,表示从u到v有一条有向边。
  • 然后是两个整数s和t,分别为路径的起点和终点。
输出格式

输出路径上的节点数。

示例输入
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的节点数和边数。