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

c/c++蓝桥杯经典编程题100道(22)最短路径问题

最短路径问题

->返回c/c++蓝桥杯经典编程题100道-目录


目录

最短路径问题

一、题型解释

二、例题问题描述

三、C语言实现

解法1:Dijkstra算法(正权图,难度★★)

解法2:Bellman-Ford算法(含负权边,难度★★★)

四、C++实现

解法1:Dijkstra算法(优先队列优化,难度★★☆)

解法2:Floyd-Warshall算法(多源最短路径,难度★★★)

五、总结对比表

六、特殊方法与内置函数补充

1. C++ STL的优先队列

2. 动态规划思想

3. 负权环检测


一、题型解释

最短路径问题是图论中的核心问题,目标是找到图中两点间权重和最小的路径。常见题型:

  1. 单源最短路径:求某一点到其他所有点的最短路径(如Dijkstra、Bellman-Ford算法)。

  2. 多源最短路径:求所有点对之间的最短路径(如Floyd-Warshall算法)。

  3. 特殊场景

    • 含负权边的最短路径(Bellman-Ford)。

    • 含负权环的检测(Bellman-Ford扩展)。

    • 边权为1的图(BFS优化)。


二、例题问题描述

例题1(单源正权图)

  • 输入:图的邻接矩阵,起点为A。

  • 输出:A到各顶点的最短距离(如A→D的最短距离为5)。

例题2(含负权边)

  • 输入:带负权边的图,检测是否存在负权环。

  • 输出:若存在环返回false,否则返回最短路径。

例题3(多源最短路径)

  • 输入:任意两点间的最短距离矩阵。

  • 输出:更新后的最短距离矩阵。


三、C语言实现

解法1:Dijkstra算法(正权图,难度★★)

通俗解释

  • 贪心策略:每次选择当前距离起点最近的节点,逐步扩展最短路径集合。

  • 适用条件:边权非负。

c

#include <stdio.h>
#include <limits.h>#define V 6  // 顶点数int minDistance(int dist[], int visited[]) {int min = INT_MAX, min_index;for (int v = 0; v < V; v++)if (!visited[v] && dist[v] <= min)min = dist[v], min_index = v;return min_index;
}void dijkstra(int graph[V][V], int src) {int dist[V];      // 存储最短距离int visited[V];   // 记录节点是否已处理for (int i = 0; i < V; i++)dist[i] = INT_MAX, visited[i] = 0;dist[src] = 0;  // 起点到自身距离为0for (int count = 0; count < V - 1; count++) {int u = minDistance(dist, visited); // 选取未处理的最小距离节点visited[u] = 1;// 更新相邻节点的距离for (int v = 0; v < V; v++)if (!visited[v] && graph[u][v] && dist[u] != INT_MAX &&dist[u] + graph[u][v] < dist[v])dist[v] = dist[u] + graph[u][v];}// 输出结果printf("顶点\t距离\n");for (int i = 0; i < V; i++)printf("%d\t%d\n", i, dist[i]);
}int main() {int graph[V][V] = {{0, 4, 0, 0, 0, 0},{4, 0, 8, 0, 0, 0},{0, 8, 0, 7, 0, 4},{0, 0, 7, 0, 9, 14},{0, 0, 0, 9, 0, 10},{0, 0, 4, 14, 10, 0}};dijkstra(graph, 0);return 0;
}

代码逻辑

  1. 初始化:距离数组dist设为无穷大,起点距离为0。

  2. 循环处理:每次选择未访问的最小距离节点,更新其邻居的距离。

  3. 时间复杂度:O(V²),适合稠密图。


解法2:Bellman-Ford算法(含负权边,难度★★★)

通俗解释

  • 松弛操作:通过多次迭代所有边,逐步逼近最短路径。

  • 附加功能:可检测负权环。

c

#include <stdio.h>
#include <limits.h>#define E 8  // 边数
#define V 5  // 顶点数struct Edge {int src, dest, weight;
};void bellmanFord(struct Edge edges[], int src) {int dist[V];for (int i = 0; i < V; i++)dist[i] = INT_MAX;dist[src] = 0;// 松弛所有边V-1次for (int i = 1; i <= V - 1; i++) {for (int j = 0; j < E; j++) {int u = edges[j].src;int v = edges[j].dest;int w = edges[j].weight;if (dist[u] != INT_MAX && dist[u] + w < dist[v])dist[v] = dist[u] + w;}}// 检测负权环for (int j = 0; j < E; j++) {int u = edges[j].src;int v = edges[j].dest;int w = edges[j].weight;if (dist[u] != INT_MAX && dist[u] + w < dist[v]) {printf("图中存在负权环!\n");return;}}// 输出结果printf("顶点\t距离\n");for (int i = 0; i < V; i++)printf("%d\t%d\n", i, dist[i]);
}int main() {struct Edge edges[E] = {{0, 1, -1}, {0, 2, 4}, {1, 2, 3},{1, 3, 2}, {1, 4, 2}, {3, 2, 5},{3, 1, 1}, {4, 3, -3}};bellmanFord(edges, 0);return 0;
}

代码逻辑

  1. 初始化:所有距离设为无穷大,起点为0。

  2. 松弛操作:进行V-1轮边遍历更新距离。

  3. 负权环检测:若第V轮仍有更新,说明存在负权环。

  4. 时间复杂度:O(VE),适合稀疏图。


四、C++实现

解法1:Dijkstra算法(优先队列优化,难度★★☆)

通俗解释

  • 使用优先队列快速获取最小距离节点,时间复杂度优化至O((V+E)logV)。

cpp

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;typedef pair<int, int> pii; // {距离, 节点}void dijkstra(vector<vector<pii>> &graph, int src) {int V = graph.size();vector<int> dist(V, INT_MAX);priority_queue<pii, vector<pii>, greater<pii>> pq;dist[src] = 0;pq.push({0, src});while (!pq.empty()) {int u = pq.top().second;int d = pq.top().first;pq.pop();if (d > dist[u]) continue; // 跳过旧数据for (auto &edge : graph[u]) {int v = edge.first;int w = edge.second;if (dist[u] + w < dist[v]) {dist[v] = dist[u] + w;pq.push({dist[v], v});}}}cout << "顶点\t距离" << endl;for (int i = 0; i < V; i++)cout << i << "\t" << dist[i] << endl;
}int main() {int V = 5;vector<vector<pii>> graph(V);graph[0].push_back({1, 4});graph[0].push_back({2, 1});graph[1].push_back({3, 2});graph[2].push_back({1, 1});graph[2].push_back({3, 5});graph[3].push_back({4, 3});dijkstra(graph, 0);return 0;
}

代码逻辑

  1. 优先队列:存储{距离, 节点},自动按距离排序。

  2. 懒惰删除:当队列中的距离大于记录的距离时跳过。

  3. STL使用vector存邻接表,priority_queue实现最小堆。


解法2:Floyd-Warshall算法(多源最短路径,难度★★★)

通俗解释

  • 动态规划:通过中间节点逐步优化所有点对的最短路径。

cpp

#include <iostream>
#include <vector>
using namespace std;#define INF INT_MAXvoid floydWarshall(vector<vector<int>> &graph) {int V = graph.size();vector<vector<int>> dist = graph;for (int k = 0; k < V; k++)for (int i = 0; i < V; i++)for (int j = 0; j < V; j++)if (dist[i][k] != INF && dist[k][j] != INF)dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);// 输出结果cout << "最短路径矩阵:" << endl;for (int i = 0; i < V; i++) {for (int j = 0; j < V; j++)cout << (dist[i][j] == INF ? "INF" : to_string(dist[i][j])) << "\t";cout << endl;}
}int main() {vector<vector<int>> graph = {{0, 5, INF, 10},{INF, 0, 3, INF},{INF, INF, 0, 1},{INF, INF, INF, 0}};floydWarshall(graph);return 0;
}

代码逻辑

  1. 初始化距离矩阵:直接复制图的邻接矩阵。

  2. 三重循环:依次考虑每个中间节点k,更新所有i→j路径。

  3. 时间复杂度:O(V³),适合小规模图。


五、总结对比表

算法时间复杂度空间复杂度适用场景
DijkstraO((V+E)logV)O(V)正权图单源最短路径
Bellman-FordO(VE)O(V)含负权边的单源最短路径
Floyd-WarshallO(V³)O(V²)多源最短路径

六、特殊方法与内置函数补充

1. C++ STL的优先队列

  • 作用:快速获取最小元素,用于优化Dijkstra算法。

  • 语法priority_queue<T, Container, Compare>,需头文件<queue>

2. 动态规划思想

  • Floyd-Warshall核心dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

3. 负权环检测

  • Bellman-Ford扩展:若第V次迭代仍有更新,则存在负权环。

->返回c/c++蓝桥杯经典编程题100道-目录

相关文章:

c/c++蓝桥杯经典编程题100道(22)最短路径问题

最短路径问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 最短路径问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;Dijkstra算法&#xff08;正权图&#xff0c;难度★★&#xff09; 解法2&#xff1a;Bellman-Ford算法&#xff08;含负权边&a…...

25中医研究生复试面试问题汇总 中医专业知识问题很全! 中医试全流程攻略 中医考研复试调剂真题汇总

各位备考中医研究生的小伙伴们&#xff0c;一想到复试&#xff0c;是不是立刻紧张到不行&#xff0c;担心老师会抛出一大堆刁钻的问题&#xff1f;别怕&#xff01;其实中医复试也是有套路可循的&#xff0c;只要看完这篇攻略&#xff0c;你就会发现复试并没有想象中那么难&…...

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)

简介: 这个小车的芯片是STM32F103C8T6&#xff0c;其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…...

centos22.04 dpkg -l 输出状态标识含义

dpkg -l 输出状态标识含义 dpkg -l 命令用于列出系统中已安装的软件包,每行输出的前两个字符是软件包状态的标识,不同的组合代表不同的状态,具体含义如下: 第一个字符:表示期望的状态(Desired state) u:未知(Unknown)i:安装(Install)r:移除(Remove)p:清除(Pu…...

前端TypeScript 面试题及参考答案

目录 解释 unknown 与 any 的区别,如何安全使用 unknown 类型? 如何用类型守卫处理联合类型变量的方法调用? 实现一个工具类型 Nullable ,使 T 可被赋值为 null/undefined 如何用 keyof 和 in 关键字实现枚举类型到联合类型的转换? 类型断言 as 与尖括号语法有何差异…...

基于 Vue.js 和 Element UI 实现九宫格按钮拖拽排序功能 | 详细教程与代码实现

在Vue.js项目中使用vue-element-template&#xff08;基于Element UI&#xff09;实现按钮的九宫格拖拽排序功能&#xff0c;可以通过以下步骤实现。我们将使用vuedraggable库来实现拖拽排序功能。 1. 安装依赖 首先&#xff0c;确保你已经安装了vuedraggable库&#xff1a; …...

Spring Framework测试工具MockMvc介绍

目录 一、基本概念 二、主要特点 三、使用场景 四、工作原理 五、示例代码 接口创建 测试类创建 六、注解解释 AutoConfigureMockMvc WebMvcTest 一、基本概念 MockMvc实现了对Http请求的模拟&#xff0c;能够直接使用网络的形式&#xff0c;转换到Controller的调用…...

nginx 正向代理与反向代理

1. 正向代理&#xff08;Forward Proxy&#xff09; 正向代理是指 代理客户端 访问目标服务器&#xff0c;通常用于访问受限资源或隐藏客户端 IP。 工作原理 客户端请求代理服务器&#xff08;如 nginx&#xff09;。代理服务器代表客户端向目标网站发起请求。目标网站返回内…...

VUE 获取视频时长,无需修改数据库,前提当前查看视频可以得到时长

第一字段处 <el-table-column label"视频时长" align"center"> <template slot-scope"scope"> <span>{{ formatDuration(scope.row.duration) }}</span> </template> </el-ta…...

使用Jenkins实现Windows服务器下C#应用程序发布

背景 在现代化的软件开发流程中&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;已经成为不可或缺的一部分。 Jenkins作为一款开源的自动化运维工具&#xff0c;能够帮助我们实现这一目标。 本文将详细介绍如何在Windows服务器下使用Jenkins来自动化发布C#应用…...

蓝桥杯练习代码

一、最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 示例 1: 输入:strs = ["flower","flow","flight"] 输出:"fl"示例 2: 输入:strs = ["dog",&q…...

算法-二叉树篇11-左叶子之和

左叶子之和 力扣题目链接 题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 解题思路 层次遍历的时候&#xff0c;保留每层第一个节点并相加即可。 题解 class Solution { public:int sumOfLeftLeaves(TreeNode* root) {if(root NULL){return 0;}re…...

[java基础-JVM篇]1_JVM自动内存管理

JVM内存管理涉及但不限于类加载、对象分配、垃圾回收等&#xff0c;本篇主要记录运行时数据区域与对象相关内容。 内容主要来源《深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践》与官方文档&#xff0c;理解与表述错漏之处恳请各位大佬指正。 目录 运行时数据区域 栈 栈…...

Junit框架缺点

JUnit 是 Java 生态中最流行的单元测试框架&#xff0c;广泛应用于单元测试和集成测试中。尽管它功能强大且易于使用&#xff0c;但也存在一些缺陷和局限性。以下是 JUnit 的主要缺点&#xff1a; 1. 功能相对固定 问题&#xff1a;JUnit 的核心功能相对固定&#xff0c;缺乏灵…...

机器学习数学基础:34.克隆巴赫α系数

克隆巴赫α系数&#xff08;Cronbach’s Alpha&#xff09;超详细教程 专为小白打造&#xff0c;零基础也能轻松学会&#xff01; 一、深度理解α系数 克隆巴赫α系数&#xff08;Cronbach’s Alpha&#xff09;是在评估测验质量时极为关键的一个指标&#xff0c;主要用于衡量…...

【Linux】vim 设置

【Linux】vim 设置 零、起因 刚学Linux&#xff0c;有时候会重装Linux系统&#xff0c;然后默认的vi不太好用&#xff0c;需要进行一些设置&#xff0c;本文简述如何配置一个好用的vim。 壹、软件安装 sudo apt-get install vim贰、配置路径 对所有用户生效&#xff1a; …...

JavaScript系列(90)--前端脚手架开发

前端脚手架开发 &#x1f6e0;️ 前端脚手架是现代前端开发流程中的重要工具&#xff0c;它能够帮助开发者快速初始化项目结构、配置开发环境、设置构建流程&#xff0c;从而提高开发效率和标准化项目结构。本文将详细介绍前端脚手架的开发原理、实现方式以及最佳实践。 脚手…...

工程实践中常见的几种设计模式解析及 C++ 实现

工程实践中常见的几种设计模式解析及 C 实现 在软件工程中&#xff0c;设计模式是一种通用的解决方案&#xff0c;用于解决常见问题和优化代码结构。它们通过提供一种规范化的编程思想&#xff0c;帮助开发者写出更高效、可维护和可扩展的代码。本文将介绍几种在工程实践中常见…...

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化&#xff08;协同过滤算法&#xff09; 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…...

Oracle 12c Docker安装问题排查 sga_target 1536M is too small

一、问题描述 在虚拟机环境&#xff08;4核16GB内存&#xff09;上部署 truevoly/oracle-12c 容器镜像时&#xff0c;一切运行正常。然而&#xff0c;当在一台 128 核 CPU 和 512GB 内存的物理服务器上运行时&#xff0c;容器启动时出现了 ORA-00821 等错误&#xff0c;提示 S…...

es-head(es库-谷歌浏览器插件)

1.下载es-head插件压缩包&#xff0c;并解压缩 2.谷歌浏览器添加插件 3.使用...

C++大整数类的设计与实现

1. 简介 我们知道现代的计算机大多数都是64位的&#xff0c;因此能处理最大整数为 2 64 − 1 2^{64}-1 264−1。那如果是超过了这个数怎么办呢&#xff0c;那就需要我们自己手动模拟数的加减乘除了。 2. 思路 我们可以用一个数组来存储大数&#xff0c;数组中的每一个位置表…...

Linux网络基础(协议 TCP/IP 网络传输基本流程 IP VS Mac Socket编程UDP)

文章目录 一.前言二.协议协议分层分层的好处 OSI七层模型TCP/IP五层(或四层)模型为什么要有TCP/IP协议TCP/IP协议与操作系统的关系(宏观上是如何实现的)什么是协议 三.网络传输基本流程局域网(以太网为例)通信原理MAC地址令牌环网 封装与解包分用 四.IP地址IP VS Mac地址 五.So…...

Web开发:ORM框架之使用Freesql的导航属性

一、什么时候用导航属性 看数据库表的对应关系&#xff0c;一对多的时候用比较好&#xff0c;不用多写一个联表实体&#xff0c;而且查询高效 二、为实体配置导航属性 1.给关系是一的父表实体加上&#xff1a; [FreeSql.DataAnnotations.Navigate(nameof(子表.子表关联字段))]…...

NLP07-朴素贝叶斯问句分类之数据集加载(1/3)

一、概述 数据集加载&#xff08;Dataset Loading&#xff09;是机器学习、自然语言处理&#xff08;NLP&#xff09;等领域中的一个重要步骤&#xff0c;指的是将外部数据&#xff08;如文件、数据库、网络接口等&#xff09;加载到程序中&#xff0c;以便进行后续处理、分析…...

Rk3568驱动开发_点亮led灯(手动挡)_5

1.MMU简介 完成虚拟空间到物理空间的映射 内存保护设立存储器的访问权限&#xff0c;设置虚拟存储空间的缓冲特性 stm32点灯可以直接操作寄存器&#xff0c;但是linux点灯不能直接访问寄存器&#xff0c;linux会使能mmu linux中操作的都是虚拟地址&#xff0c;要想访问物理地…...

LangChain构建行业知识库实践:从架构设计到生产部署全指南

文章目录 引言:行业知识库的进化挑战一、系统架构设计1.1 核心组件拓扑1.2 模块化设计原则二、关键技术实现2.1 文档预处理流水线2.2 混合检索增强三、领域适配优化3.1 医学知识图谱融合3.2 检索结果重排序算法四、生产环境部署4.1 性能优化方案4.2 安全防护体系五、评估与调优…...

Vscode编辑器:解读文件结构、插件的导入导出、常用快捷键配置技巧及其常见问题的解决方案

一、文件与文件夹结构 1.文件结构 文件名作用.babelrc配置 Babel 编译选项&#xff0c;指定代码转译规则。.editorconfig定义项目代码格式规范&#xff0c;如缩进风格和空格数量等。.eslintignore列出 ESLint 忽略的文件或文件夹。.eslintrc.js配置 ESLint 的规则和插件。.gi…...

androidstudio 运行项目加载很慢,优化方法

一、Android Studio 运行项目加载缓慢可能由多种原因引起&#xff0c;以下是一些优化建议&#xff1a; 1. 升级硬件配置 内存&#xff1a;建议至少 8GB&#xff0c;16GB 或以上更佳。 SSD&#xff1a;使用 SSD 替代 HDD 以加快读写速度。 CPU&#xff1a;多核处理器有助于提…...

Vue性能翻倍秘籍

导读&#xff1a;某电商大促因工程化缺失导致页面崩溃&#xff01;本文通过双11级别流量压测&#xff0c;揭秘Vue项目性能优化的6大核心策略&#xff0c;涵盖构建提速、首屏优化、SSR实战等全链路方案。 工程化缺失引发的灾难现场 血泪案例&#xff1a; 某电商大促活动因工程化…...