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

18732 最短路问题

### 思路

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.mrgr.cn/news/44548.html

相关文章:

  • Oracle 实时表空间使用率和最大表空间使用率区别
  • 自动驾驶系统研发系列—如何选择适合自动驾驶的激光雷达?从基础到高端全解读
  • STM32PWM应用
  • 智能医疗:Spring Boot医院管理系统开发
  • 【韩顺平Java笔记】第8章:面向对象编程(中级部分)【262-271】
  • win11下AMD CPU支持WSL2
  • 如何使用BlinkShot.io生成照片
  • 爬虫案例——爬取长沙房产网租房信息
  • 手势分割系统源码&数据集分享
  • MATLAB中lsqminnorm函数用法
  • 【AI知识点】批归一化(Batch Normalization)
  • ArkUI中的状态管理
  • 【编程基础知识】Java静态导入的艺术与实践
  • 【前沿 热点 顶会】NIPS/NeurIPS 2024中与尖峰/脉冲神经网络(Spiking neural networks)有关的论文
  • 大模型新人必看经验,刷到少走数月弯路!
  • 括号匹配——(栈实现)
  • Java 中的 File 类及 InputStream 和 OutputStream 的用法总结
  • 医院综合服务系统小程序的设计
  • 简单理解动态规划
  • 基于ssm 和uniapp 开发的微信小程序的学生选课系统设计与实现