18732 最短路问题

server/2024/10/21 7:44:25/

### 思路

1. **建模问题**:将车站和公交线路建模为图,其中车站是节点,公交线路是带权边。
2. **选择算法**:使用Dijkstra算法求解从车站1到车站n的最短路径问题。
3. **初始化**:创建一个优先队列(最小堆)来存储当前节点和到达该节点的最小花费。初始化所有节点的最小花费为无穷大,起点车站1的花费为0。
4. **更新节点**:从优先队列中取出当前花费最小的节点,更新其邻接节点的最小花费,并将更新后的节点重新加入优先队列。
5. **终止条件**:当处理到车站n时,输出其最小花费;如果优先队列为空且未处理到车站n,输出-1。

### 伪代码

```
function dijkstra(n, m, edges):
    create a priority queue pq
    create a list dist of size n+1, initialized to infinity
    dist[1] = 0
    pq.push((0, 1))  // (cost, node)

    while pq is not empty:
        (current_cost, u) = pq.pop()
        if u == n:
            return current_cost
        if current_cost > dist[u]:
            continue
        for each (v, cost) in edges[u]:
            if dist[u] + cost < dist[v]:
                dist[v] = dist[u] + cost
                pq.push((dist[v], v))

    return -1
```

### C++代码

#include <iostream>
#include <vector>
#include <queue>using namespace std;const int INF = 1e9; // Define a large constant value for infinitystruct Edge {int to, cost;
};int dijkstra(int n, int m, vector<vector<Edge>>& graph) {vector<int> dist(n + 1, INF);priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;dist[1] = 0;pq.push(make_pair(0, 1));while (!pq.empty()) {pair<int, int> top = pq.top();int current_cost = top.first;int u = top.second;pq.pop();if (u == n) {return current_cost;}if (current_cost > dist[u]) {continue;}for (const auto& edge : graph[u]) {int v = edge.to;int cost = edge.cost;if (dist[u] + cost < dist[v]) {dist[v] = dist[u] + cost;pq.push(make_pair(dist[v], v));}}}return -1;
}int main() {int n, m;cin >> n >> m;vector<vector<Edge>> graph(n + 1);for (int i = 0; i < m; ++i) {int a, b, x;cin >> a >> b >> x;graph[a].push_back({b, x});graph[b].push_back({a, x});}int result = dijkstra(n, m, graph);cout << result << endl;return 0;
}

### 总结

1. **问题建模**:将车站和公交线路建模为图,使用Dijkstra算法求解最短路径问题。
2. **算法选择**:Dijkstra算法适用于边权非负的最短路径问题,使用优先队列(最小堆)优化。
3. **实现细节**:初始化所有节点的最小花费为无穷大,起点车站1的花费为0。使用优先队列存储当前节点和到达该节点的最小花费,逐步更新邻接节点的最小花费。
4. **终止条件**:当处理到车站n时,输出其最小花费;如果优先队列为空且未处理到车站n,输出-1。


http://www.ppmy.cn/server/128279.html

相关文章

FinalShell解决Docker日志中文乱码问题

在DockerFile文件末尾添加如下配置即可解决&#xff1a; #解决Docker容器中文显示乱码问题 ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8

php常用的注释符号

如果没有安装vscode和小皮&#xff0c;请点击下方链接安装&#xff1a; Vscode、小皮面板安装-CSDN博客 在学习php过程中&#xff0c;肯定少不了注释&#xff0c;也可以理解为备注的信息&#xff0c;来提醒自己这段代码有什么用&#xff0c;是什么意思等&#xff0c;接下来就介…

平台数据分类与聚类实验报告

参考书籍&#xff1a;《数据流挖掘与在线学习算法》 李志杰 1.6.1 实验目的 本书内容以及课程实验主要涉及Java程序设计语言、数据挖掘工具Weka和数据流机器学习平台MOA&#xff0c;因此&#xff0c;需要安装、配置并熟悉实验环境。Java、Weka和MOA都是开源小软件&#xff0…

制作离线版Koczkatamas工具包

一、下载源码 从https://github.com/koczkatamas/koczkatamas.github.io下载koczkatamas.github.io-master.zip 二、解压 $ unzip koczkatamas.github.io-master.zip三、运行index.html 可以看到输入一个字符后&#xff0c;下面的各种编码都没有显示&#xff0c;则表示运行…

基于51单片机的多路电压测量proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1cpgtfl571DcKfjhKvcKqSA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

生信机器学习入门4 - 构建决策树(Decision Tree)和随机森林(Random Forest)分类器

机器学习文章回顾 生信机器学习入门1 - 数据预处理与线性回归&#xff08;Linear regression&#xff09;预测 生信机器学习入门2 - 机器学习基本概念 生信机器学习入门3 - Scikit-Learn训练机器学习分类感知器 生信机器学习入门4 - scikit-learn训练逻辑回归&#xff08;L…

Qt源码阅读——事件循环

文章目录 一、 QCoreApplication的exec()实现二、 QEventLoop的exec()实现1. D指针用法2. 获取线程数据3. 加锁和判断4. 局部类LoopReference4.1 LoopReference的构造函数:4.2 QThreadData的成员变量4.3 LoopReference的析构函数4.4 小结 5. 事件循环5.1 processEvents() 三、小…

【代码随想录Day29】贪心算法Part03

134. 加油站 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;贪心算法&#xff0c;得这么加油才能跑完全程&#xff01;LeetCode &#xff1a;134.加油站_哔哩哔哩_bilibili class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {// 创建一…