首页 > 其他分享 >18732 最短路问题

18732 最短路问题

时间:2024-10-13 14:21:09浏览次数:3  
标签:pq dist int 车站 短路 问题 cost 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 infinity

struct 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。

标签:pq,dist,int,车站,短路,问题,cost,18732,节点
From: https://blog.csdn.net/huang1xiao1sheng/article/details/142738701

相关文章

  • NOI提高级 图论算法:单源次短路
    DIJ(单源次短路)-TwoPaths-HDU6181DIJ(单源次短路)-TwoPaths-HDU6181-CSDN博客单源次短路(P2829大逃离)单源次短路(P2829大逃离)-CSDN博客单源次短路算法学习笔记单源次短路算法学习笔记-Wiueh_Plus-博客园次短路及次短路计数次短路及次短路......
  • Android12.0 需求开发篇+问题解决篇之IPC socket通信
    1.需求描述        应用组C程序客户端和Android系统层Java服务端进行通信需求,这里其实在Android系统下IPC的方式有很多,像Binder作为Android特有的跨进程通信,但是应用组的同事之前是非Android系统下进行应用开发,使用的都是socket这种通用IPC通信。这里为兼容应用组代码......
  • ab压测的选项、示例和主要关注的指标意义以及ab压测问题Connection reset by peer (10
    一、ab压测的选项、示例和主要关注的指标意义1.ab压测的一些选项-nrequests    全部请求数-cconcurrency 并发数-ttimelimit   最传等待回应时间-ppostfile    POST数据文件-Tcontent-typePOSTContent-type-vverbosity   Howmuchtroubl......
  • Qt开发技巧(十六):文本框的光标处理,数据库的int在视图中展示问题,工程文件中区分系统及硬
    继续讲一些Qt开发中的技巧操作:1.文本框的光标处理正常情况下我们在文本框中输入,光标会一直伴随着我们的输入指向最后,有点像链表的next指针,但有时候文本框中的内容过长,而我们想要主动设置下将光标移到最前面的时候,可以用下面方法。//下面三种方法都可以//1.样式表方式设......
  • 将threejs的官方文档部署到本地,遇到的问题及解决方法
    问题:官方文档浏览速度慢。 1.下载https://threejs.org/官网首页左侧,点击“download”下载  2.得到压缩包:three.js-master.zip解压到本地 3. 部署用VSCode打开解压后的文件夹运行命令:npminstall运行命令:npmrundev  报错:  问了一下AI,得到如何解......
  • 贪心算法案例 - 零钱兑换问题
    贪心算法案例-零钱兑换问题贪心算法原则:每一次都选取当前最优解《向前看,别回头》案例:(322.零钱兑换-力扣(LeetCode))题目描述:给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有......
  • 记录工作开发日常遇到的问题点-css字体
    data.forEach((item,index)=>{style+=@font-face{font-family:'FileType${index}';src:url('${item.FileUrl}')format('truetype');}ht+=`});$('head').append($('<style>&......
  • chainlit 实际部署一些问题
    chainlit内部基于了socket.io进行消息处理,socket.io是有一些缺陷的,但是也有相关的解决方法,同时对于启动的入口是加载的一个python文件,这个处理上是动态加载里边的方法到chainlit运行环境的内部一些处理load模块处理defload_module(target:str,force_refre......
  • 【SOP】迭代管理-如何更好的避免问题发生
    人们往往不知道做事情的原因,所以不知道该如何做,下边先告诉大家,为什么要流程标准化?会给我们带来的好处,也就是所谓的SOP的优点(标准操作程序)。工作中曾遇到的问题,有些可能会导致故障或影响需求交付标题需求层面发生的问题:需求生效范围不清晰,导致故障平台升级时,通知不到位,......
  • B. 全排列问题
    时间限制:1s 空间限制:256MB输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。(注意输出格式)输入n(1<=n<=9)输出由1~n组成的所有不重复的数字序列,每一行一个序列,每个数字前4个空格。样例样例输入13样例输出11......