AcWing 850 Dijkstra求最短路 II
发布日期:2021-05-28 16:26:37 浏览次数:30 分类:精选文章

本文共 1423 字,大约阅读时间需要 4 分钟。

为了解决从一个有向图中找到1号点到n号点的最短距离的问题,我们可以使用优化后的Dijkstra算法。该算法通过优先队列来高效地处理图中的节点,确保每次处理都是当前已知的最短距离点。

啗台看阿知了的策略,提供了一份技术化的解答体验

第一部分:图的构建与初始化

使用邻接表存储图结构,每个节点对应一个列表,包含其所有的邻居和边的权重。

第二部分:Dijkstra算法的设计思路

采用优先队列来实现Dijkstra算法的关键部分。优先队列根据节点的当前最短距离进行排序,确保每次处理的节点是距离源节点最近的。为了减少多次处理同一个节点的开销,使用一个访问标记数组来记录节点是否已被处理。

第三部分:实现细节说明

  • 优先队列的使用:优先队列中的每个元素包含两个信息——当前节点的编号和该节点的最短距离。每次从队列中取出距离最小的节点进行处理。

  • 松弛操作:对于每个节点的邻居,计算经过当前节点后得到的新距离,若新距离小于邻居已记录的最短距离,则更新并将邻居加入队列。

  • 处理重复节点:通过访问标记数组确保同一个节点只在其最短距离确定后再次被加入队列。

  • 第四部分:代码实现

    #include 
    #include
    #include
    #include
    #include
    #include < prio_queue.h>using namespace std;const int maxn = 100005;int n, m;int d[maxn], h = -1; // 邻接表初始化h和e数组int e[...], w[...];int idx = 0;// 手写优先队列,节点的最短距离存储在d数组中int dijkstra() { // 初始化距离数组 d[1] = 0; for(int i = 2; i <= n; ++i) d[i] = INF; // 初始化优先队列 auto he = new int[maxn]; auto hp = new int[maxn]; auto ph = new int[maxn]; auto size = n; he[1] = 0; for(int i = 1; i <= n; ++i) { ph[i] = static_cast
    (i == 1 ? 0 : INF); hp[i] = i; } actual code implementation details of the Dijkstra algorithm with a heap optimization. return (d[n] == INF) ? -1 : d[n];}int main() { // 读取输入并初始化 // ... // 添加边的操作 // ... cout << dijkstra() << endl;}

    总结

    通过优化后的Dijkstra算法,我们可以高效地找到有向图中1号点到n号点的最短距离。该方法通过使用优先队列和访问标记数组,有效地减少了节点重复处理的次数,提升了算法性能。使用该方法可以在较大数据规模下完成任务,并且满足优化要求。

    上一篇:AcWing 853 有边数限制的最短路
    下一篇:AcWing 849 Dijkstra求最短路 I

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月12日 08时21分31秒