度小满4.20笔试第二题城市旅行最小价值BFS

考试的时候忘了一个细节导致一个用例都没过,最后没时间了,考完试才发现忘了题目的下标值不是从0开始的,修改完是可以通过用例的,不知道这样做思路是否正确,有没有大佬指导下?

import sys
from collections import deque


def parse_nums(nums_str):
    return [int(x) for x in nums_str.strip().split()]


def bfs(cs, a, b, c):
    target = len(cs) - 1
    visited = [False] * len(cs)
    queue = deque()
    queue.append((0, 0))
    visited[0] = True
    direcitions = [(0, a), (1, a + c), (-1, a + b)]
    while queue:
        x, t = queue.popleft()
        for d in direcitions:
            nx, nt = cs[x] + d[0], t + d[1]
            if 0 <= nx < len(cs) and not visited[nx]:
                if nx == target:
                    return nt
                queue.append((nx, nt))
                visited[nx] = True
    return -1


for line in sys.stdin:
    n, a, b, c = parse_nums(line)
    cs = parse_nums(input())
    # 忘了写这两行啊啊啊啊
    for i in range(len(cs)):
        cs[i] -= 1
    print(bfs(cs, a, b, c))  # 答案4
#度小满笔试##度小满##笔试题目#
全部评论
我一开始也觉得是bfs,但又觉得bfs不能保证最优解,不知道想的对不对
点赞 回复 分享
发布于 2020-04-20 17:59
bfs可以保证第一次搜索到的是最小的
点赞 回复 分享
发布于 2020-04-20 19:15
我的做法是每一个点记录第一个点到其的位置最小花费,如果直接能从第一个点到达,花费就是a,如果不行,就算通过前面那些位置到他最小花费,记录下来。只过了65
点赞 回复 分享
发布于 2020-04-20 21:08
我做的是回溯法 提交的时候忘记剪枝了
点赞 回复 分享
发布于 2020-04-21 10:19

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
1 4 评论
分享
牛客网
牛客企业服务