18732 最短路问题

news2024/12/27 19:52:01

### 思路

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年诺贝尔生理学或医学奖揭晓:microRNA及其在转录后基因调控中的作用

microRNA&#xff08;miRNA&#xff09;是一类长度约为19-25nt的内源性非编码RNA&#xff0c;它们在真核生物中通过参与基因的转录后调控&#xff0c;实现对靶基因的表达调节。miRNA的调控作用主要通过两种机制&#xff1a;翻译抑制和mRNA的降解。 翻译抑制&#xff1a;miRNA与…

LeetCode讲解篇之70. 爬楼梯

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 爬楼梯有一个规律&#xff0c;爬到第n层楼梯的方法种数 爬到第n - 1层楼梯的方法种数 爬到第n - 1层楼梯的方法种数 也就是我们爬到第n层楼梯其实是从第n - 1层楼梯向上爬1层或者是n - 2层楼梯向上爬2层转换来…

【雷达数据集】RADDet: 面向动态道路使用者的基于距离-方位-多普勒的雷达目标检测【附链接】

微信公众号&#xff1a;EW Frontier 关注可了解更多的雷达、通信、人工智能相关代码。问题或建议&#xff0c;请公众号留言;如果你觉得EW Frontier对你有帮助&#xff0c;欢迎加入我的知识星球或面包多&#xff0c;更多代码等你来学 知识星球&#xff1a;https://wx.zsxq.com/d…

美客多测评系统:批量注册买家号的新利器

美客多&#xff08;MercadoLibre&#xff09;测评系统作为一种在跨境电商领域广泛应用的策略&#xff0c;其核心在于通过批量注册并管理买家账号&#xff0c;模拟真实用户的购物行为&#xff0c;以提升产品的销量、评价数量和店铺权重。以下是对美客多测评系统中批量注册买家号…

HCIE《网络括谱图》

企业园区网 终端>接入>汇聚>核心>出口区(防火墙)>互联网

大数据新视界 --大数据大厂之TeZ 大数据计算框架实战:高效处理大规模数据

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

stm32学习笔记-RTC实时时钟

文章目录 一、RTC基础知识1.1 RTC简介1.2 RTC的晶振 二、stm32的RTC2.1 RTC和后备寄存器2.2 stm32 RTC结构框图及特性 三、stm32 RTC编程2.1 RTC初始化2.2 RTC控制程序 一、RTC基础知识 1.1 RTC简介 实时时钟的缩写是RTC(Real_Time Clock)。RTC 是集成电路&#xff0c;通常称…

第十三篇——虚数:虚构这个工具有什么用?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 认知一下就拉起来了&#xff1b;没有的东西&#xff0c;构建出来&#xf…

如何使用Flair.ai实现模特换装效果

在数字化时代&#xff0c;科技让我们实现了许多过去无法想象的功能。Flair.ai就是这样一个神奇的工具&#xff0c;它可以帮助你轻松实现模特换装效果。以下是详细步骤&#xff0c;教你如何使用Flair.ai来实现这一过程。 第一步&#xff1a;访问Flair.ai网站 首先&#xff0c;…

10.3 Linux_进程_创建守护进程

守护进程创建方法 守护进程是什么&#xff1a; 守护进程又叫精灵进程&#xff0c;是一个生存期较长的进程&#xff0c;通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。它是一个在后台运行的孤儿进程&#xff0c;这使得守护进程不受终端的信息影响&…

【算法笔记】二分算法原理的深度剖析

【算法笔记】二分算法原理的深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】二分算法原理的深度剖析前言一.二分查找1.1题目1.2朴素二分1.3细节问题1.4代码实现1.5朴素模版总结 二.在排序数组中查找…

用Arduino单片机制作一个简单的音乐播放器

Arduino单片机上有多个数字IO针脚&#xff0c;可以输出数字信号&#xff0c;用于驱动发声器件&#xff0c;从而让它发出想要的声音。蜂鸣器是一种常见的发声器件&#xff0c;通电后可以发出声音。因此&#xff0c;单片机可以通过数字输出控制蜂鸣器发出指定的声音。另外&#x…

视频色彩变幻剪辑:批量剪辑工具大揭秘

在视频剪辑领域&#xff0c;将视频画面添加一些色彩是一项常见需求。幸运的是&#xff0c;市面上存在多款批量剪辑工具&#xff0c;能够轻松实现这一剪辑&#xff0c;提升视频品质与观感。像视频剪辑高手一次可剪辑多个视频素材。易操作。一起来试试。 1打开“视频剪辑高手”软…

【时间之外】昔日销售大佬今求职难

目录 国庆结束 中年危机下的家庭缩影&#xff1a;昔日销售大佬今求职难 生存智慧之三大人生策略 国庆结束 今天是国庆节的最后一天假期了。 7天的大调休&#xff0c;搞得人非常疲惫&#xff0c;想想接下来还有5天的工作日&#xff0c;就觉得这个调休实在是烦人。 中年危机…

企业为什么需要MES系统?

企业为什么需要MES系统&#xff1f; 提高生产效率&#xff1a; MES系统能够实时采集生产现场的数据&#xff0c;并根据这些数据对生产计划进行动态调整&#xff0c;最大化设备利用率和产能。通过优化生产流程&#xff0c;减少生产中的非增值时间&#xff0c;提高整体生产效率。…

史上最强传奇资源编辑器

支持&#xff1a;WIL WIS WZL PAK&#xff08;GOM GEE V8 LEG&#xff09; 批量修改密码、全格式转换、文件归类、资源优化、坐标调整辅助、GIF动画生成、衣服武器合成一体 资料地址&#xff1a;史上最强传奇资源编辑器 - 工具软件程序 - 51开发者联盟 - 51SF.CC

C语言文件操作(下)(28)

文章目录 前言一、文件的打开和关闭打开打开模式相对路径和绝对路径 关闭 二、文件操作正确流程三、文件顺序读写函数fopenfclosefputcfgetcfputsfgetsfprintffscanfsprintfsscanffwritefread 四、文件随机读写函数fseekftellrewind 五、文件读取结束时候的判断feofferror具体例…

关于持续输出内容的思路分享及分析

一、核心内容 &#xff08;一&#xff09;亦仁的分享 来自V先生的小密圈&#xff0c;提出做垂直领域内容持续输出的思路。很多大 v 不敢开小密圈是担心内容持续输出问题。掌握一套方法论应用于无数场景&#xff0c;就有无数案例和素材。列举 10 个铜山&#xff1a;装修风格点…

浏览器前端向后端提供服务

WEB后端向浏览器前端提供服务是最常见的场景&#xff0c;前端向后端的接口发起GET或者POST请求&#xff0c;后端收到请求后执行服务器端任务进行处理&#xff0c;完成后向前端发送响应。 那浏览器前端向后端提供服务是什么鬼&#xff1f; 说来话长&#xff0c;长话短说。我在人…

每日OJ题_牛客_组队竞赛_贪心_C++_Java

目录 牛客_组队竞赛_贪心 题目解析 C代码1 C代码2 Java代码 牛客_组队竞赛_贪心 组队竞赛_牛客笔试题_牛客网 (nowcoder.com) 描述&#xff1a; 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个…