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

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…...

AI工具集合

设计相关 1. mastrtgo&#xff08;暂时免费&#xff09; &#xff1a;可以根据自然语言生成UI设计稿和前端代码 MasterGo 莫高设计 - AI 时代的数字界面生产平台 2. reddy.ai&#xff08;暂时免费&#xff09;: 国外类似mastrtgo的平台 Readdy 3. midjourney &#xff08;…...

CSDN 博客:CC++ 内存管理详解

CSDN 博客&#xff1a;C/C 内存管理详解 在软件开发过程中&#xff0c;内存管理是一个非常重要的环节。对于 C 和 C 这两种编程语言&#xff0c;它们都拥有独特的内存管理机制&#xff0c;理解这些机制对于编写高效、健壮的程序至关重要。本文将详细讲解 C/C 内存管理相关的内…...

表单制作代码,登录动画背景前端模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。一个炫酷的按钮特效不仅能提升用户体验,还能为网页增添独特的视觉吸引力。今天,我们将通过CSS来实现一个“表单制作代码,登录动画背景前端模板”。该素材呈现了数据符号排版显示出人形的动画效果,新颖有…...

嵌入式项目:STM32刷卡指纹智能门禁系统

本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助&#xff0c;请点链接&#xff1a; https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端&#xff08;下位机&#xff09;…...

LeetCode 热题100 141. 环形链表

LeetCode 热题100 | 141. 环形链表 大家好&#xff0c;今天我们来解决一道经典的算法题——环形链表。这道题在 LeetCode 上被标记为简单难度&#xff0c;要求我们判断一个链表中是否存在环。下面我将详细讲解解题思路&#xff0c;并附上 Python 代码实现。 题目描述 给定一个…...

以绘图(绘制点、直线、圆、椭圆、多段线)为例子 通过设计模式中的命令模式实现

为了在命令模式的基础上实现撤销&#xff08;Undo&#xff09;和回退&#xff08;Redo&#xff09;功能&#xff0c;我们可以在每个命令类中记录一些必要的状态&#xff0c;允许我们撤销之前的操作&#xff0c;并在需要时回退操作。常见的做法是使用一个命令堆栈来存储历史命令…...

鹏哥c语言数组(初阶数组)

前言&#xff1a; 对应c语言视频54集 内容&#xff1a; 一维数组的创建 数组是一组相同元素的集合&#xff0c; 数组的创建方式 type_t就是数组的元素类型&#xff0c;const_n是一个常量表达式&#xff0c;用来指定数组的大小 c99标准之前的&#xff0c;数组的大小必须是…...

利用go-migrate实现MySQL和ClickHouse的数据库迁移

1. 背景 在使用gorm时 , 尽管已经有了自动建表和钩子函数 . 但是在面临希望了解到数据库的变更 , 和插入一些系统字段时 , 以及最关键的数据库迁移的工作 . gorm显得稍微有点不便 . 在了解到migrate这项技术后 , 就使用go-migrate开发了一个可以迁移MySQL和ClickHouse数据库的…...

计算机毕业设计SpringBoot+Vue.js企业客户管理系统(源码+LW文档+PPT+讲解+开题报告)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

jmeter 如何做移动端的测试 特别是兼容性测试

JMeter本身主要是一款用于性能测试和功能测试的工具,虽然它并非专门为移动端测试设计,但可以通过一些方式来对移动端应用进行测试,以下从测试准备、测试过程及注意事项等方面为你详细介绍: 一、测试准备 (一)环境搭建 JMeter安装与配置:确保JMeter已经正确安装在测试机…...

深度学习技术全景图:从基础架构到工业落地的超级进化指南

&#x1f50d; 目录导航 基础架构革命训练优化秘技未来战场前瞻 &#x1f9e9; 一、基础架构革命 1.1 前馈神经网络&#xff08;FNN&#xff09; ▍核心结构 import torch.nn as nnclass FNN(nn.Module):def __init__(self):super().__init__()self.fc1 nn.Linear(784, 25…...

vllm部署LLM(qwen2.5,llama,deepseek)

目录 环境 qwen2.5-1.5b-instruct 模型下载 vllm 安装 验证安装 vllm 启动 查看当前模型列表 OpenAI Completions API&#xff08;文本生成&#xff09; OpenAI Chat Completions API&#xff08;chat 对话&#xff09; vllm 进程查看&#xff0c;kill llama3 deep…...

基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“古城景区管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册界面 景…...

如何防止 Docker 注入了恶意脚本

根据您的描述&#xff0c;攻击者通过 CentOS 7 系统中的 Docker 注入了恶意脚本&#xff0c;导致自动启动名为 “masscan” 和 “x86botnigletjsw” 的进程。这些进程可能用于网络扫描或其他恶意活动。为了解决这一问题&#xff0c;建议您采取以下步骤&#xff1a; 1. 停止并删…...

使用python接入腾讯云DeepSeek

本文主要从提供SSE方式接入DeepSeek&#xff0c;并通过fastapi websocket对外提供接入方法。 参考文档&#xff1a; 腾讯云大模型&#xff1a;https://cloud.tencent.com/document/product/1759/109380 fastAPI官网&#xff1a;https://fastapi.tiangolo.com/ WebSocketManager…...

【MySQL】服务正在启动或停止中,请稍候片刻后再试一次【解决方案】

问题呈现 在使用MySQL的过程中我们可能会遇到以上的情况 解决方法 首先以管理员身份打开命令行窗口&#xff0c;注意是管理员身份&#xff0c;不然无权限访问。输入命令tasklist| findstr "mysql"&#xff0c;用于查找mysql的残留进程。这个时候我们就会看到一个…...

测试工程师玩转DeepSeek之Prompt

以下是测试工程师使用DeepSeek的必知必会提示词指南&#xff0c;分为核心场景和高效技巧两大维度&#xff1a; 一、基础操作提示模板 1. 测试用例生成 "作为[金融系统/物联网设备/云服务]测试专家&#xff0c;请为[具体功能模块]设计测试用例&#xff0c;要求&#xff1…...

【PyTorch】2024保姆级安装教程-Python-(CPU+GPU详细完整版)-

一、准备工作 pytorch需要python3.6及以上的python版本 我是利用Anaconda来管理我的python。可自行安装Anaconda。 Anaconda官网 Free Download | Anaconda 具体Anaconda安装教程可参考 https://blog.csdn.net/weixin_43412762/article/details/129599741?fromshareblogdet…...

精选案例展 | 智己汽车—全栈可观测驱动智能化运营与成本优化

本案例为“观测先锋 2024 可观测平台创新应用案例大赛”精选案例&#xff0c;同时荣获IT168“2024技术卓越奖评选-年度创新解决方案”奖。 项目背景 近年来&#xff0c;中国汽车行业进入转型升级阶段&#xff0c;智能网联技术成为行业发展的核心。车联网、自动驾驶等技术的加速…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...