📌  相关文章
📜  国际空间研究组织 | ISRO CS 2011 |问题 1(1)

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

国际空间研究组织 | ISRO CS 2011 | 问题 1

本题需要求解能否从一个点出发,经过一系列的路径,到达另一个特定的点。具体地,给定一些起始点、结束点和一些中间可能连接起点和终点的路径,需要确定能否从给定的起始点到达对应的结束点。

输入格式

输入的第一行包含一个整数 $T$,表示数据组数。

每组数据的第一行包含两个整数 $N$ 和 $M$,分别表示路径的条数和起始点的编号。其中,道路的编号从 $1$ 到 $M$。

接下来的 $N$ 行每行包含三个整数 $X_i, Y_i, Z_i$,表示一条从点 $X_i$ 到点 $Y_i$ 的单向道路,长度为 $Z_i$。

最后一行包含两个整数 $S$ 和 $D$,分别表示起始点和目的终点的编号。

输出格式

对于每组数据,输出一行,如果能从起始点到达目的终点,则输出 Yes,否则输出 No

代码实现
T = int(input())

for _ in range(T):
    N, M = map(int, input().split())
    graph = [[] for _ in range(N+1)]
    visited = [False] * (N+1)

    for i in range(M):
        x, y, z = map(int, input().split())
        graph[x].append((y, z)) # x 到 y 的路径长度为 z

    s, d = map(int, input().split())

    def dfs(node):
        if node == d:
            return True

        for next_node, weight in graph[node]:
            if not visited[next_node]:
                visited[next_node] = True
                if dfs(next_node):
                    return True

        return False

    visited[s] = True
    if dfs(s):
        print("Yes")
    else:
        print("No")

注意到本题是求解是否存在从起点到终点的路径,是一个经典的深度优先搜索问题。在求解的过程中,我们需要维护已经访问过的节点,并对每个节点进行遍历,直到找到目标节点或者遍历完整个图。最终如果找到目标节点则输出 Yes,否则输出 No

因此,我们可以使用一个 dfs 函数进行遍历。在遍历到目标节点的时候,返回 True,表示找到了目标节点。如果对于当前节点 node,它的下一个节点 next_node 还没有被访问过,那么我们在递归地遍历 next_node 时,需要将 visited[next_node] 设为真。如果最终无法找到目标节点,则返回 False

在实际的代码实现过程中,我们可以将图表示为邻接表形式,即对于每个节点 i,维护一个包含 (j, w) 元组的列表 graph[i],表示节点 i 到其他节点 j 的有向边的权值为 w。为避免重复访问节点,我们在访问节点 i 时,将 visited[i] 设为真。

最终,我们可以对每一组数据进行一次以上述方式求解,并将输出结果按相应格式输出。