最短路模型——AcWing 188. 武士风度的牛

最短路模型

定义

最短路模型是图论中的一个经典问题,旨在寻找从图中一个顶点到另一个顶点的路径,使得这条路径上的边(或边的权重)之和最小。这一模型在许多实际问题中有着广泛的应用,比如网络路由、地图导航、物流配送等场景。

在图论中,最短路问题通常形式化为在一个加权图 G=(V,E)G=(V,E) 中寻找两个顶点 uu 和 vv 之间的最短路径,其中 VV 是顶点集,EE 是边集,每条边 e \in Ee∈E 都有一个非负权重 w(e)w(e)。目标是找到一条从 uu 到 vv 的路径,使得路径上所有边的权重之和最小。

运用情况

  1. 网络路由:在互联网中,数据包需要通过最少的延迟或最低的成本从源节点传输到目的节点,这可以看作是一个最短路径问题。
  2. 地图导航:为司机或行人提供从起点到终点的最快或距离最短的路线。
  3. 物流与供应链管理:确定货物从仓库到客户或从供应商到工厂的最优运输路线,以减少运输成本和时间。
  4. 电路设计:在集成电路设计中,选择信号传递的最短路径以减少延迟和功耗。
  5. 社交网络分析:分析两个人之间关系链的最短路径,用于推荐系统或影响力传播分析。

注意事项

  1. 负权重边:如果图中存在负权重边,则不能直接使用某些算法如Dijkstra算法,而应考虑Bellman-Ford算法或Floyd-Warshall算法,因为它们能处理负权。
  2. 环路检测:在有负权重边的情况下,需要检查是否存在负权重环,因为这样的环路会导致无限减小路径长度,从而使问题无解。
  3. 稠密图与稀疏图:根据图的密度选择合适的算法。例如,Floyd-Warshall算法适用于稠密图,而Dijkstra或A*算法更适合稀疏图。
  4. 多源或多目标:当需要计算多个源点到单个目标或多个目标的最短路径时,可能需要对算法进行适当调整或多次调用。

解题思路

  1. 理解问题:首先明确问题是否为单源最短路径还是多源最短路径,图中是否存在负权重边。
  2. 选择算法:根据问题的具体情况选择合适的算法。常见的算法有Dijkstra算法(适用于无负权的单源最短路径)、Bellman-Ford算法(可处理负权重但无负权重环)、Floyd-Warshall算法(解决所有顶点对之间的最短路径,适合稠密图)。
  3. 实现与优化:实现所选算法,并考虑如何优化,比如使用优先队列优化Dijkstra算法,或在特定情况下利用预处理技巧减少计算量。
  4. 验证结果:检查计算出的路径是否确实是最短的,并确保没有违反任何先决条件,如负权重环的存在。

AcWing 188. 武士风度的牛

题目描述

AcWing 188. 武士风度的牛 - AcWing

运行代码

#include <cstring>
#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 155, M = N * N;int n, m;
char g[N][N];
PII q[M];
int dist[N][N];int bfs()
{int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};int sx, sy;for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )if (g[i][j] == 'K')sx = i, sy = j;int hh = 0, tt = 0;q[0] = {sx, sy};memset(dist, -1, sizeof dist);dist[sx][sy] = 0;while (hh <= tt){PII t = q[hh ++ ];for (int i = 0; i < 8; i ++ ){int a = t.x + dx[i], b = t.y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (g[a][b] == '*') continue;if (dist[a][b] != -1) continue;if (g[a][b] == 'H') return dist[t.x][t.y] + 1;dist[a][b] = dist[t.x][t.y] + 1;q[ ++ tt] = {a, b};}}return -1;
}int main()
{cin >> m >> n;for (int i = 0; i < n; i ++ ) cin >> g[i];cout << bfs() << endl;return 0;
}

代码思路

  1. 包含文件和宏定义:

    • 包含了 <cstring><iostream> 和 <algorithm> 头文件,分别用于字符串处理、输入输出和算法操作。
    • 定义了一个宏 N 作为最大地图大小,并定义了类型别名 PII 为 pair<int, int>,用于存储坐标。
    • 使用 #define x first 和 #define y second 来简化 pair 对象的访问。
  2. 变量声明和初始化:

    • 声明了 n 和 m 分别代表地图的行数和列数,二维字符数组 g 存储地图信息,q 作为队列存储待访问的坐标,dist 数组记录每个位置到起点的最短距离。
    • 通过 memset 函数将 dist 数组初始化为 -1,表示未访问过。
  3. 核心函数 bfs():

    • 首先,通过双层循环遍历地图,找到起始位置 'K' 的坐标 (sx, sy)
    • 初始化队列 q,并将起始位置入队。
    • 进行广度优先搜索,定义了变量 hh 和 tt 作为队列的头尾指针,并用数组 dx 和 dy 来表示马可能的八个移动方向。
    • 在 BFS 循环中,每次从队列头部取出一个坐标,遍历其八个可能的下一个位置,检查这些位置是否越界、是否有障碍物('*')或是否已经访问过。若新位置有效且未访问,则更新该位置的最短距离,并将其加入队列。
    • 如果在搜索过程中遇到草('H'),立即返回当前的最短距离加一(因为起始点的初始距离为0)。
    • 若循环结束仍未找到草,则返回 -1 表示无解(根据题目描述,这种情况实际上不会发生)。
  4. 主函数 main():读取地图的列数 m 和行数 n,然后逐行读取地图信息。调用 bfs() 函数计算并输出最短跳跃次数。

改进思路

  1. 代码注释:添加详细的注释,特别是对于关键变量、数组含义、函数功能等进行说明,提高代码的可读性和维护性。

  2. 命名规范:变量命名可以更加直观,例如将 sx, sy 改为 startX, startY,将 hh, tt 改为 head, tail,以增加代码的自解释性。

  3. 宏定义优化:考虑到使用 #define x first 和 #define y second 可能导致的命名冲突和阅读困难,可以考虑直接在代码中使用 first 和 second,或者在BFS函数内部临时定义辅助函数来访问pair的元素。

  4. 避免全局变量:尽量减少全局变量的使用,可以将 nmgqdist 等变量作为 bfs 函数的参数传入,以减少不同部分间的耦合度。

  5. 边界检查和错误处理:虽然题目保证有解,但在实际应用中,增加对输入数据的校验(如检查地图尺寸是否合理,起点和终点是否存在等)可以提高程序的健壮性。

  6. 内存使用优化:当地图规模非常大时,可以考虑使用压缩存储或动态分配内存来减少空间消耗,例如只对访问过的节点分配dist数组的空间。

  7. 代码结构清晰化:将BFS逻辑拆分成几个小函数,如初始化队列、拓展节点等,可以让代码逻辑更清晰,便于阅读和维护。

  8. 使用标准库函数或STL容器:考虑使用std::queue代替原始数组实现队列,这样可以利用STL容器的便利性,减少手动管理数组指针的复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365574.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】图生图img3img论文原理,SD EDIT

https://arxiv.org/abs/2108.01073 摘要 引导图像合成技术使普通用户能够以最小的努力创建和编辑逼真的图像。关键挑战在于平衡对用户输入&#xff08;例如&#xff0c;手绘的彩色笔画&#xff09;的忠实度和合成图像的真实感。现有的基于GAN的方法试图通过使用条件GAN或GAN反…

面试相关-接口测试常问的问题

1.为什么要做接口测试 (1)现在大多系统都是前后端分离的项目,前端和后端的进度可能不一样,那为了尽早的进入测试,前端界面没有开发完成的情况下,只要后端的接口开发完了,就可以提前做接口测试了; (2)基于安全考虑,只依赖前端进行限制,已经完全不满足系统的安全性…

c++习题02-浮点数求余

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 虽然在浮点类型中没有取余的运算&#xff08;无法直接使用%符号取余&#xff09;&#xff0c;但是我们都知道在数学中&#xff0c;除法是减法的连续运算&#xff…

trie[讲课留档]

字典树 1.字典树简介 字典树 ( Trie 树 ) 又称单词查找树&#xff0c; 是一种用于在字符串集合中高效地存储和查找字符串的树形数据结构。 我们首先通过一张图来理解字典树的结构&#xff1a; 我们假定结点的顺序按照图中给定的顺序进行编号&#xff0c;容易发现&#xff0c…

Golang-slice理解

slice golang-slice语雀笔记整理 slicego为何设计slice&#xff1f;引用传递实现扩容机制 go为何设计slice&#xff1f; 切片对标其他语言的动态数组&#xff0c;底层通过数组实现&#xff0c;可以说是对数组的抽象&#xff0c;底层的内存是连续分配的所以效率高&#xff0c;可…

Spring Boot项目的两种发布方式

一、通过jar包发布 1、在pom中添加一个SpringBoot的构建的插件 <build><plugins><plugin><groupId>org.springframework.boot</groupId><!--自动检测项目中的 main 函数--><artifactId>spring-boot-maven-plugin</artifactId>…

一文get懂kwai短视频助力巴西博弈slots游戏广告优势

一文get懂kwai短视频助力巴西博弈slots游戏广告优势 在数字化时代&#xff0c;短视频广告凭借其独特的魅力和高效的传播方式&#xff0c;成为了各大品牌进行营销推广的重要手段。特别是在巴西这个充满活力的国家&#xff0c;kwai短视频广告以其独特的方式&#xff0c;为博弈游…

2024企业数据资产化及数据资产入表方案梳理

01 数据资产入表&#xff1a;是一个将组织的各类数据资产进行登记、分类、评估和管理的流程。 数据资产包括&#xff1a;客户信息、交易记录、产品数据、财务数据等。 做个比喻吧&#xff1a;数据资产入表就像是给公司的数据资产做“人口普查”—— ①找出公司有哪些数据找…

Pytorch课程论文设计参考

Pytorch下基于卷积神经网络的手写数字识别 论文格式 利用wps初步美化论文格式教程 wps论文格式变的的原因 格式变的根本原因是word为流式文件&#xff0c;就算同是word同一个版本不同电脑也会有可能变&#xff0c;字体变是因为没有嵌入字体然后观看的那台没有这个字体。 一、…

机器学习环境搭建

前言 个人笔记&#xff0c;记录框架和小问题&#xff0c;没有太详细记载。。 1、Anaconda安装 下载地址&#xff1a; Free Download | Anaconda &#xff08;慢&#xff09; ​ 国内镜像&#xff1a;https://link.csdn.net/?targethttp%3A%2F%2Fitcxy.xyz%2F241.html 下载…

【硬件开发】安规电容X电容和Y电容

为什么有安规电容 国家为了保护人民的安全要求&#xff0c;电容器失效后&#xff0c;不会导致电击&#xff0c;不危及人身安全的安全电容器 安规电容的作用 滤除雷电冲击波&#xff0c;以及插拔插座的高频噪声 X电容 聚酯电容 位置 X电容位于火线和零线之间 作用 滤除…

Bunny的PT+SFT训练

GitHub - BAAI-DCAI/Bunny: A family of lightweight multimodal models.A family of lightweight multimodal models. . Contribute to BAAI-DCAI/Bunny development by creating an account on GitHub.https://github.com/BAAI-DCAI/Bunny1.环境安装 conda create -n bunny …

观测云产品更新 | Pipelines、智能监控、日志数据访问等

观测云更新 Pipelines 1、Pipelines&#xff1a;支持选择中心 Pipeline 执行脚本。 2、付费计划与账单&#xff1a;新增中心 Pipeline 计费项&#xff0c;统计所有命中中心 Pipeline 处理的原始日志的数据大小。 监控 1、通知对象管理&#xff1a;新增权限控制。配置操作权…

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误&#xff0c;请重新选择!\n");break;}}while(input);//直到输入的结果为假&#xff0c;循环才会结束} …

springboot是否可以代替spring

Spring Boot不能直接代替Spring&#xff0c;但它是Spring框架的一个扩展和增强&#xff0c;提供了更加便捷和高效的开发体验。以下是关于Spring Boot和Spring关系的详细解释&#xff1a; Spring框架&#xff1a; Spring是一个广泛应用的开源Java框架&#xff0c;提供了一系列模…

什么是有效的电子签名?PDF电子签名怎样具备法律效力?

电子签名逐渐成为商务文书和法律文件中不可或缺的一部分。《电子签名法》自2005年4月1日起施行&#xff0c;这一立法是中国信息化法律的重要里程碑&#xff0c;为电子签名应用奠定了法律基础。电子签名不仅仅是一种技术手段&#xff0c;更是一种法律认可的签名形式。那么究竟什…

跨模型知识融合:大模型的知识融合

大模型&#xff08;LLMs&#xff09;在多个领域的应用日益广泛&#xff0c;但确保它们的行为与人类价值观和意图一致却充满挑战。传统对齐方法&#xff0c;例如基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;虽取得一定进展&#xff0c;仍面临诸多难题&#…

百刀神书!从0搭建神经网络!我服!

《Neural Networks from Scratch in Python》是一本深入浅出的书籍&#xff0c;旨在帮助读者从零开始理解和实现神经网络模型。作者使用Python语言&#xff0c;从基本的数学概念和神经网络的基本原理开始&#xff0c;逐步引导读者探索神经网络的各个组成部分。 该书介绍了神经…

AI数字人直播系统源码解析:教你如何高效搭建直播系统!

在人工智能技术飞速发展的今天&#xff0c;以AI数字人直播为代表的数字人应用开始为各大企业引进&#xff0c;并引发了一场“AI数字人直播浪潮”。在此背景下&#xff0c;许多创业者都感受到了所蕴含着的巨大前景和收益空间&#xff0c;从而有了搭建AI数字人直播系统的想法&…

BGE M3-Embedding 模型介绍

BGE M3-Embedding来自BAAI和中国科学技术大学&#xff0c;是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216&#xff0c;论文提出了一种新的embedding模型&#xff0c;称为M3-Embedding&#xff0c;它在多语言性&#xff08;Multi-Linguality&#xff09;、多功能…