【蓝桥杯】真题 2386染色时间 (优先队列BFS)

思路

这里每一个格子染色多了时间这一层限制,相当于图的每一边有了权重的限制,那么我们就不能直接用双向队列求最短路。而是使用优先队列。

规则是这样的:每一个节点可以多次入队,但是只有第一次出队有效。所以这次我们不会在加入队列时更改标签vis,而是在出队时更改标签。如果在出队时发现vis已经更改,这说明这个元素以前出过队列(不是第一次出队),则直接continue

code

我们额外设置两个数组,vis标签数组用于判断是否出队,dis距离数组用于记录到达这个位置花费的最小时间

python 复制代码
import os
import sys
from queue import PriorityQueue
INF = int(1e9)

# 输入数据
n, m = map(int, input().split())
arr = [[0 for i in range(m+1)]]
for i in range(n):
  arr.append([0]+list(map(int,input().split())))

# 初始化vis和dis
vis = [[0 for i in range(m+1)] for j in range(n+1)]
dis = [[INF for i in range(m+1)] for j in range(n+1)]
dis[1][1] = arr[1][1] # 对于起点,dis就是其染色时间
dq = PriorityQueue()
dq.put((dis[1][1],1,1)) # 出发点入队

ans = 0
while not dq.empty():
  d, x, y = dq.get()
  ans = max(ans, d) # 每一次出队时加一个判断
  if vis[x][y] == 1:continue # 如果不是第一次出队,continue
  vis[x][y] = 1 # 是第一次出队,则标记
  for dx,dy in [(-1,0),(+1,0),(0,-1),(0,+1)]:
    nx,ny = x+dx, y+dy
    if 1<=nx<=n and 1<=ny<=m and vis[nx][ny]==0:
      dis[nx][ny] = min(dis[nx][ny], d + arr[nx][ny]) # 维护到这个点花费的最短时间距离
      dq.put((dis[nx][ny],nx,ny))
print(ans)
相关推荐
慧翔天地人才发展学苑8 小时前
大厂 | 华为半导体业务部2026届秋招启动
华为·面试·职场和发展·跳槽·求职招聘·职场晋升
程序员三藏10 小时前
Selenium+python自动化测试:解决无法启动IE浏览器及报错问题
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
黑客影儿14 小时前
黑客哲学之学习笔记系列(三)
笔记·学习·程序人生·安全·职场和发展·网络攻击模型·学习方法
熬了夜的程序员15 小时前
【LeetCode】16. 最接近的三数之和
数据结构·算法·leetcode·职场和发展·深度优先
Miraitowa_cheems15 小时前
LeetCode算法日记 - Day 15: 和为 K 的子数组、和可被 K 整除的子数组
java·数据结构·算法·leetcode·职场和发展·哈希算法
火车叨位去19492 天前
力扣top100(day04-05)--堆
算法·leetcode·职场和发展
qq_513970443 天前
力扣 hot100 Day76
算法·leetcode·职场和发展
liulilittle3 天前
BFS寻路算法解析与实现
开发语言·c++·算法·宽度优先·寻路算法·寻路
程序员曦曦3 天前
10:00开始面试,10:06就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
是乐谷3 天前
阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
java·人工智能·阿里云·面试·职场和发展·机器人·云计算