C++实现Dijkstra(迪杰斯特拉)算法

当我们需要在一个带权重的图中找到起始点到目标点的最短路径时,Dijkstra算法是一种较为常见的解决方法。下面,我将为大家详细讲解如何使用C++语言实现Dijkstra算法的完整攻略。

前置知识

在学习本文之前,你需要掌握以下基础知识:

  • C++语言基础
  • 图的基本概念和表示方法
  • 最短路径问题和算法

如果你对上述知识点掌握不够扎实,我建议你先去学习相关基础知识。

什么是Dijkstra算法

Dijkstra算法是一种解决最短路径问题的贪心算法,用于在带权重的图中找到起始点到目标点的最短路径。算法的核心思想是通过不断扩展起点到每个节点的最短路径来逐步扩展最短路径集合,直到找到起点到终点的最短路径为止。

Dijkstra算法的具体实现

以下是Dijkstra算法的具体实现流程:

  1. 创建一个“已访问节点集合”和一个“未访问节点集合”,将起始点加入“已访问节点集合”,将剩余节点加入“未访问节点集合”。

  2. 将起始点到各个节点的距离初始化为INFINITY(无穷大),将起始点到起始点的距离设置为0。

  3. 在“未访问节点集合”中查找到起始点到该节点距离最短的节点,标记该节点为“已访问节点”,并更新该节点周围所有节点的距离。

  4. 重复步骤3,直到起始点到目标点的最短路径被找到或者“未访问节点集合”为空。

以下是使用C++语言实现Dijkstra算法的完整代码示例:

#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>

using namespace std;

typedef pair<int, int> P;       // P.first 为距起点的距离, P.second 为节点编号

const int MAX_SIZE = 10000;     // 最大节点数
const int INF = INT_MAX;        // 无穷大

vector<P> graph[MAX_SIZE];      // 图的邻接表表示

vector<int> dijkstra(int start, int size) {
    vector<int> dist(size, INF);
    priority_queue<P, vector<P>, greater<P>> q;      // 小根堆优化
    q.push(P(0, start));
    dist[start] = 0;
    while(!q.empty()) {
        P now = q.top();
        q.pop();
        int v = now.second;
        if(now.first > dist[v]) continue;
        for(int i=0; i<graph[v].size(); ++i) {
            int to = graph[v][i].second;
            int cost = graph[v][i].first;
            if(dist[to] > dist[v] + cost) {
                dist[to] = dist[v] + cost;
                q.push(P(dist[to], to));
            }
        }
    }
    return dist;
}

int main() {
    int n, m;
    cin >> n >> m;
    for(int i=0; i<m; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        graph[a].push_back(make_pair(c, b));
        graph[b].push_back(make_pair(c, a));
    }
    vector<int> dist = dijkstra(0, n);
    for(int i=0; i<n; ++i) {
        cout << "Dist from 0 to " << i << ": " << dist[i] << endl;
    }
    return 0;
}

在上面代码实现中,我们先创建一个Priority Queue实现优化,用来记录“未访问节点集合”中到起点距离最小的节点。

然后我们使用邻接表的形式来表示图,把输入的节点和边存储进去。

最后,我们使用dijkstra()函数来返回起始点到所有节点的最短距离,并打印输出每个节点的最短距离。

示例说明

我们来看一个具体的示例,有5个节点(0-4),0节点为起点,我们要求从0节点到其他各节点的最短距离(真实结果可能与示例不同)。

输入:

5 7
0 1 2
0 2 4
1 2 1
1 3 5
2 3 1
2 4 3
3 4 1

输出:

Dist from 0 to 0: 0
Dist from 0 to 1: 2
Dist from 0 to 2: 3
Dist from 0 to 3: 4
Dist from 0 to 4: 5

从输出结果我们可以看出,0节点到其他节点的最短距离符合预期。

总结

以上就是关于使用C++语言实现Dijkstra算法的完整攻略,希望本文能给大家带来帮助。如果您有任何问题或疑问,请在评论区留言,我会尽快回复您的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现Dijkstra(迪杰斯特拉)算法 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • ps中怎么制作水火交融的字体效果?

    要制作水火交融的字体效果,可以使用Photoshop中的图层样式,具体步骤如下: 创建文字图层 在Photoshop中创建一个新的文档,然后选择文字工具在文档中添加一个文本。可以选择任何字体、任何颜色的文本,具体根据个人需要来定。 添加渐变图层样式 在图层面板中,选择文本图层。然后在图层面板顶部的图层样式(fx)图标上点击鼠标右键,选择“渐变叠加”选项,在弹…

    C 2023年5月23日
    00
  • C++迷宫问题的求解算法

    C++迷宫问题的求解算法 解决迷宫问题的算法种类很多,其中最常见的算法是回溯法和广度优先搜索。这里分别介绍这两种算法的实现以及具体的问题求解方式。 回溯法 回溯法是一种遍历所有解空间的算法,当我们在一条路径上探索到某条路程时,发现这条路无法到达正确的终点,我们就返回到上一个路口重新探索其他路径。这里我们以递归方式实现回溯法,其中每个节点的四个方向按照顺序依次…

    C 2023年5月22日
    00
  • C# JSON格式化转换辅助类 ConvertJson

    C#是一种广泛使用的面向对象编程语言,而JSON格式化转换是现代程序中广泛使用的数据交换方式,将一个对象或一组对象序列化为JSON格式数据非常常见。ConvertJson是一个C# JSON格式化转换辅助类,在处理JSON格式数据时非常实用。接下来,我将为您提供关于如何使用ConvertJson的完整攻略。 安装 ConvertJson可以从NuGet包中获…

    C 2023年5月23日
    00
  • 详解C++ 拷贝构造函数和赋值运算符

    标题:详解C++ 拷贝构造函数和赋值运算符 什么是拷贝构造函数和赋值运算符 在C++中,每一个类都有一个默认的拷贝构造函数和赋值运算符。拷贝构造函数和赋值运算符的作用是对一个已经存在的对象进行复制。 拷贝构造函数用于创建一个新对象并将某个已经存在的对象的值赋给它。赋值运算符则在已有对象上操作。 拷贝构造函数 拷贝构造函数的定义格式如下: ClassName(…

    C 2023年5月22日
    00
  • Python JSON格式数据的提取和保存的实现

    下面是“Python JSON格式数据的提取和保存的实现”的完整攻略。 JSON格式概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON使用Unicode字符集,支持数字、字符串、布尔值、null、数组和对象,具有较高的可读性。 提取JSON数据 在Python…

    C 2023年5月23日
    00
  • win11怎么分盘?Win11电脑C磁盘分盘方法

    下面是“win11怎么分盘?Win11电脑C磁盘分盘方法”的完整攻略。 准备工作 在进行C盘分区之前,请确保您已经对电脑进行了备份,并且您有管理员权限以进行分区更改。此外,您还需要具备一些分区工具,例如Disk Management、DiskGenius、EaseUS Partition Master等。 方法一:使用Disk Management分区工具 …

    C 2023年5月23日
    00
  • Spring 4.1+JSONP的使用指南

    Spring 4.1+JSONP的使用指南 什么是JSONP JSONP(JSON with padding)是一种跨域数据访问的解决方案。在同源策略限制下,浏览器无法直接访问不同域下的服务器资源,但是可以通过<script>标签加载资源,因此JSONP的实现原理就是通过在URL后加入一个回调函数名,返回值作为函数的参数,被包裹在函数调用中,从而…

    C 2023年5月23日
    00
  • C++深入探究二阶构造模式的原理与使用

    C++深入探究二阶构造模式的原理与使用 什么是二阶构造模式? 二阶构造模式是C++中一个设计模式,也被称为”构造与初始化分离”(Construct and Initialize Separately)模式。 它的基本思想是将一个类的构造和初始化代码分开,将构造函数负责分配储存空间和设置默认值,而初始化函数则负责实际的初始化工作。 为什么要使用二阶构造模式? …

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部