当前位置: 首页 > news >正文

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

在这里插入图片描述

思路

这里每一个格子染色多了时间这一层限制,相当于图的每一边有了权重的限制,那么我们就不能直接用双向队列求最短路。而是使用优先队列。
规则是这样的:每一个节点可以多次入队,但是只有第一次出队有效。所以这次我们不会在加入队列时更改标签vis,而是在出队时更改标签。如果在出队时发现vis已经更改,这说明这个元素以前出过队列(不是第一次出队),则直接continue

code

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

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)

相关文章:

  • 智慧教育云平台支持下的学生自主学习能力培养策略研究
  • dfs刷题矩阵搜索问题
  • 深入理解Java虚拟机(学习笔记)
  • 开源视频剪辑工具,无损编辑更高效
  • 车道保持中车道线识别
  • XSS 攻击向量与绕过技巧
  • OpenCV的基本用法全解析
  • 【深度学习入门_机器学习理论】梯度提升决策树(GBDT)
  • C语言-状态模式详解与实践 - OTA升级状态机
  • 计算机网络层超全解析:从IP协议到路由算法
  • .gitignore使用指南
  • el-select 可搜索下拉框 在ios、ipad 无法唤出键盘,造成无法输入
  • Nginx请求头Hos头攻击
  • 【YOLO项目】毕设大作业之车道线检测
  • 【Linux系统】Linux权限讲解!!!超详细!!!
  • 二、Python核心编程
  • Tomcat常见漏洞攻略
  • Linux 启动Jar脚本设置开机自启【超级详细】
  • 蓝桥刷题note9(分发饼干,最长回文子串)
  • Windows server 2022域控制服务器的配置
  • 2025年五一档电影新片票房破3亿
  • 新势力4月销量出炉:零跑逾4万辆再夺冠,蔚来环比增近六成,小米下滑
  • 拍摄《我们这一代》的肖全开展“江浙沪叙事”
  • 金融监管总局修订发布《行政处罚办法》,7月1日起施行
  • 山西太原一小区发生爆炸,造成1人遇难21人受伤2人失联
  • 广东省副省长刘红兵跨省调任湖南省委常委、宣传部长