路径规划(二):Dijkstra算法

Dijkstra算法

一、概述

Dijkstra算法是一种用于找到图中最短路径的算法。

二、Dijkstra算法步骤

Dijkstra算法是一种用于求解带权图中单源最短路径的算法。以下是Dijkstra算法的步骤:

  1. 初始化:创建两个数组,一个用于记录每个节点的最短路径长度(dist数组),初始值为无穷大,另一个用于判断节点是否已经被访问(visited数组),初始值为未访问。

  2. 设置起点:将起点的最短路径长度设置为0,并将其标记为已访问。

  3. 更新最短路径:对于起点的所有邻接节点,计算通过起点到达该节点的路径长度,并更新dist数组中的最短路径长度。

  4. 选择最短路径节点:从未访问的节点中选择一个最短路径长度最小的节点,并将其标记为已访问。

  5. 更新其它节点的最短路径:对于刚被访问的节点的邻接节点,计算通过刚被访问的节点到达该邻接节点的路径长度,并更新dist数组中的最短路径长度。

  6. 重复步骤4和5,直到所有节点都被访问。

  7. 最短路径获取:根据dist数组中的最短路径长度,可以得到从起点到其他节点的最短路径。

三、相关代码

下面是用C语言编写的Dijkstra算法的代码示例:

c 复制代码
#include <stdio.h>
#include <stdbool.h>

// 定义无穷大的值
#define INFINITE 9999
#define MAX_NODES 10

// 计算最短路径
void dijkstra(int graph[MAX_NODES][MAX_NODES], int start, int dist[MAX_NODES], bool visited[MAX_NODES]) {
    // 初始化dist数组和visited数组
    for (int i = 0; i < MAX_NODES; i++) {
        dist[i] = INFINITE;
        visited[i] = false;
    }

    // 设置起点的最短路径长度为0
    dist[start] = 0;

    // 寻找最短路径
    for (int count = 0; count < MAX_NODES - 1; count++) {
        int minDist = INFINITE;
        int minDistNode = -1;

        // 选择最短路径长度最小的节点
        for (int i = 0; i < MAX_NODES; i++) {
            if (!visited[i] && dist[i] < minDist) {
                minDist = dist[i];
                minDistNode = i;
            }
        }

        // 标记该节点为已访问
        visited[minDistNode] = true;

        // 更新其他节点的最短路径长度
        for (int i = 0; i < MAX_NODES; i++) {
            if (!visited[i] && graph[minDistNode][i] && dist[minDistNode] != INFINITE &&
                dist[minDistNode] + graph[minDistNode][i] < dist[i]) {
                dist[i] = dist[minDistNode] + graph[minDistNode][i];
            }
        }
    }
}

int main() {
    int graph[MAX_NODES][MAX_NODES] = {
        {0, 4, 0, 0, 0, 0, 0, 8, 0},
        {4, 0, 8, 0, 0, 0, 0, 11, 0},
        {0, 8, 0, 7, 0, 4, 0, 0, 2},
        {0, 0, 7, 0, 9, 14, 0, 0, 0},
        {0, 0, 0, 9, 0, 10, 0, 0, 0},
        {0, 0, 4, 14, 10, 0, 2, 0, 0},
        {0, 0, 0, 0, 0, 2, 0, 1, 6},
        {8, 11, 0, 0, 0, 0, 1, 0, 7},
        {0, 0, 2, 0, 0, 0, 6, 7, 0}
    };

    int start = 0;
    int dist[MAX_NODES];
    bool visited[MAX_NODES];

    dijkstra(graph, start, dist, visited);

    printf("节点\t最短路径长度\n");
    for (int i = 0; i < MAX_NODES; i++) {
        printf("%d\t%d\n", i, dist[i]);
    }

    return 0;
}

以上代码实现了Dijkstra算法的功能,可以计算带有权值的图中从起点到其他节点的最短路径长度。输入的图使用邻接矩阵表示,其中无连接的两个节点之间的距离为0。输出结果为每个节点的最短路径长度。

相关推荐
似水এ᭄往昔3 分钟前
【初阶数据结构】--排序算法
数据结构·算法·排序算法
2301_781143567 分钟前
C语言笔记(四)
c语言·笔记·算法
算法-大模型备案 多米19 分钟前
算法备案算法安全自评估报告模板(精简完善版)
大数据·网络·人工智能·算法·文心一言
Frostnova丶22 分钟前
LeetCode 238 & 2906.构造乘积数组与乘积矩阵
算法·leetcode·矩阵
张槊哲25 分钟前
拆解大语言模型(LLM)的底层推演、架构演进与工业落地
算法
sali-tec35 分钟前
C# 基于OpenCv的视觉工作流-章41-模板匹配
图像处理·人工智能·opencv·算法·计算机视觉
进击的小头42 分钟前
第16篇:系统的稳定裕度分析
python·算法
黎阳之光1 小时前
AI数智筑防线 绿色科技启新篇,如何用硬核技术赋能生态安全双升级
人工智能·科技·算法·安全·数字孪生
2201_758642641 小时前
自定义内存检测工具
开发语言·c++·算法
Westward-sun.1 小时前
矿物分类实战(一):从异常值到标准化——数据清洗全流程拆解
人工智能·算法·机器学习·数据清洗