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

yizhihongxing

当我们需要在一个带权重的图中找到起始点到目标点的最短路径时,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日

相关文章

  • C语言执行程序时遇到的常见问题及解决

    C语言执行程序时遇到的常见问题及解决 C语言是一种非常流行的编程语言,但在执行程序时,常会遇到各种问题。下面我们来看一些常见问题及解决方案。 1. 编译错误 在编译程序时,我们可能会遇到各种编译错误,如语法错误、未定义的变量或函数等。解决这些错误需要仔细检查代码,并修改错误的部分。 示例: #include <stdio.h> int main(…

    C 2023年5月23日
    00
  • C语言的语法风格与代码书写规范指南

    C语言的语法风格与代码书写规范指南 C语言作为一门编程语言,具有严谨、简洁、高效的特点。为了使得代码易于维护、易于理解、易于扩展,需要遵守一些语法风格与代码书写规范。 命名规范 变量名、函数名等采用小写字母加下划线的方式,如:user_id 宏定义采用全部大写的方式,如:#define MAX_NUM 100 结构体名、枚举类型名首字母大写,采用驼峰命名法,…

    C 2023年5月23日
    00
  • C语言库函数qsort的使用详解

    C语言库函数qsort的使用详解 什么是qsort函数? qsort函数是C标准库中的一个排序函数,它可以对任意类型的数组进行排序。qsort函数需要5个参数,分别为待排序数组的首地址、元素的个数、元素大小、比较函数和可选的参数指针。 qsort函数使用步骤 第一步:编写比较函数 用于确定排序顺序的比较函数有两个参数,分别为需要比较的元素的指针。该函数需要返…

    C 2023年5月23日
    00
  • C++连接并使用MySQL数据库

    一、C++连接MySQL数据库简介C++是一门非常流行的编程语言,除了可以进行基本的编程外,它还可以连接多种数据库进行数据操作,其中之一就是MySQL数据库。在本篇文章中,我们将讲解如何使用C++连接并操作MySQL数据库,并提供用C++语言的示例代码。 二、安装MySQL C++ Connector在使用C++连接MySQL数据库之前,需要先安装MySQL…

    C 2023年5月22日
    00
  • C语言代码实现简单的扫雷小游戏

    C语言代码实现简单的扫雷小游戏 一、游戏规则 扫雷是一款经典的单人益智小游戏,游戏场景是一个区块是由许多个格子组成的矩形网格,有一部分格子下面隐藏着地雷,玩家通过揭露不带雷的部分,最终找到所有地雷的位置。 具体游戏规则: 鼠标左键点开或标记可疑格子。 若点击的是地雷,则游戏结束,显示所有地雷的位置。 若点击的是数字,则显示周边8个格子中地雷的数量。 若点击的…

    C 2023年5月23日
    00
  • C语言实现五子棋小游戏

    C语言实现五子棋小游戏攻略 1. 环境准备 在开始编写五子棋小游戏前,需要先确定所用的开发工具以及环境。 1.1 开发工具 可以使用任何一种 C 语言开发工具,如 Visual Studio、Code::Blocks、Dev-C++等。本攻略以 Code::Blocks 为例进行讲解。 1.2 环境配置 安装 Code::Blocks 后,需要进行一些环境配…

    C 2023年5月23日
    00
  • C++实现中值滤波的示例代码

    下面我将为您详细讲解C++实现中值滤波的示例代码的完整攻略。 什么是中值滤波? 中值滤波是一种基本的数字图像处理方法,它是一种非线性滤波器,可以消除图像中的噪声,保持边缘细节。中值滤波的原理是对滤波器窗口中的像素点进行排序,然后取中间的数值作为滤波结果。通常情况下,中值滤波器的窗口大小是一个奇数,如3×3、5×5等等。 C++中值滤波示例代码 在C++中实现…

    C 2023年5月23日
    00
  • C++学习之算术运算符使用详解

    C++学习之算术运算符使用详解 在C++语言中,算术运算符是一组用于执行算术运算(如加减乘除)的运算符。在本篇文章中,我们将进行深入的讨论和示范 C++ 中常用的算术运算符。本文主要包括以下内容: 算术运算符概述 算术运算符优先级 算术运算符使用示例 算术运算符概述 C++ 中的算术运算符如下表所示: 运算符 描述 + 加法 – 减法 * 乘法 / 除法 %…

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