📅  最后修改于: 2023-12-03 15:07:33.713000             🧑  作者: Mango
本题需要求解能否从一个点出发,经过一系列的路径,到达另一个特定的点。具体地,给定一些起始点、结束点和一些中间可能连接起点和终点的路径,需要确定能否从给定的起始点到达对应的结束点。
输入的第一行包含一个整数 $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]
设为真。
最终,我们可以对每一组数据进行一次以上述方式求解,并将输出结果按相应格式输出。