📜  门| GATE CS 2011 |问题22(1)

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

门 | GATE CS 2011 | 问题22

本题为GATE CS 2011年考试题目22。本篇文章将会给各位程序员介绍这道题目的具体情况,以及题目所要求的解题思路及其实现方式。

题目描述

给定一个单向有向图,图中的节点编号为1到n。请你计算出从节点1到节点n的最小跳数,其中一次跳跃所能到达的节点编号位于当前节点编号的奇数倍。

输入格式

第一行包含一个整数t,表示测试用例的数量。每个测试用例的第一行包含一个整数n,表示图中的节点数量。第二行包含n个整数,表示每个节点所能跳到的节点列表。如果没有可到达节点,则该列表为空。

输出格式

对于每个测试用例,请输出节点1到节点n的最小跳数。如果节点1无法到达节点n,则输出"NO"。

解题思路

本题可采用广度优先搜索,可以用一个队列来记录所有的跳数以及到达的节点,并且可以记录每个节点是否被访问过。

我们首先将节点1加入到队列中,并记录它的跳数,将其标记为已访问。然后我们从队列中取出一个节点,通过该节点所指向的所有节点进行遍历,如果是该节点的奇数倍并且没有被访问过,就将其添加到队列中,并记录它的跳数和标记为已访问。如果遍历完全部节点,我们还没有到达节点n,则我们判定无法到达节点n。

代码实现
from collections import deque

def minimum_jumps(n, graph):
    visited = [False] * (n+1)
    queue = deque()
    queue.append((1, 0))
    visited[1] = True

    while queue:
        curr_node, jumps = queue.popleft()
        if curr_node == n:
            return jumps
        for node in graph[curr_node]:
            if node % curr_node == 0 and not visited[node]:
                queue.append((node, jumps+1))
                visited[node] = True
    return "NO"
总结

本题考察了程序员广度搜索的知识,需要程序员充分了解广度优先搜索算法并做好代码实现。