首页 > 编程语言 >迪杰斯特拉算法、弗洛伊德算法和BFS(广度优先搜索)

迪杰斯特拉算法、弗洛伊德算法和BFS(广度优先搜索)

时间:2024-11-13 16:48:31浏览次数:3  
标签:int 路径 迪杰 BFS ++ 算法 顶点

迪杰斯特拉算法、弗洛伊德算法和BFS(广度优先搜索)都是用于求解最短路径问题的经典算法,它们各自有不同的特点和适用场景。以下是对这三种算法的介绍、区别以及代码实现的简要概述。

迪杰斯特拉算法(Dijkstra's algorithm)

  1. 介绍

    • 迪杰斯特拉算法是一种单源最短路径算法,用于计算一个顶点到其他所有顶点的最短路径。
    • 该算法适用于有向图和带非负权值边的图。
    • 算法通过维护一个距离数组来记录每个顶点到起点的最短路径长度,并通过松弛操作不断更新最短路径。
  2. 特点

    • 简单易懂,可以得到正确的解。
    • 在稠密图中有较好的表现。
    • 无法处理带负权边的图和带有负循环的图。
// 省略了部分代码,包括结构体定义、数组初始化等
void ShortestPath_Dijkstra(MGraph G, int v0, PathMatrix *p, ShortPathTable *D) {
    int final[MAX_VERtEX_NUM]; // 用于存储各顶点是否已经确定最短路径的数组
    // 对各数组进行初始化
    for (int v = 0; v < G.vexnum; v++) {
        final[v] = 0;
        (*D)[v] = G.arcs[v0][v];
        (*p)[v] = 0;
    }
    // 源点到自身的距离为0
    (*D)[v0] = 0;
    final[v0] = 1;
    int k = 0;
    for (int i = 0; i < G.vexnum; i++) {
        int min = INFINITY;
        // 选择到各顶点权值最小的顶点
        for (int w = 0; w < G.vexnum; w++) {
            if (!final[w] && (*D)[w] < min) {
                k = w;
                min = (*D)[w];
            }
        }
        // 设置该顶点的标志位为1
        final[k] = 1;
        // 更新源点到各顶点的权值
        for (int w = 0; w < G.vexnum; w++) {
            if (!final[w] && (min + G.arcs[k][w] < (*D)[w])) {
                (*D)[w] = min + G.arcs[k][w];
                (*p)[w] = k; // 记录路径
            }
        }
    }
}

弗洛伊德算法(Floyd-Warshall algorithm)

  1. 介绍

    • 弗洛伊德算法是一种多源最短路径算法,用于计算任意两个顶点之间的最短路径。
    • 该算法适用于带有任意权值边的图。
    • 算法通过维护一个邻接矩阵来记录每对顶点之间的最短路径长度,并通过动态规划的方法不断更新最短路径。
  2. 特点

    • 可以处理带负权边的图和带有负循环的图。
    • 能够找到所有最短路径。
    • 时间复杂度较高,不适用于大规模图的计算。
  3. 代码实现(C语言示例,简化版):

// 省略了部分代码,包括结构体定义、数组初始化等
void Floyd(MGraph G, PathMatrix *path, ShortPathTable *D) {
    int n = G.vexnum;
    // 初始化距离矩阵和路径矩阵
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            (*D)[i][j] = G.arcs[i][j];
            (*path)[i][j] = j;
        }
    }
    // 动态规划求解最短路径
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if ((*D)[i][k] + (*D)[k][j] < (*D)[i][j]) {
                    (*D)[i][j] = (*D)[i][k] + (*D)[k][j];
                    (*path)[i][j] = k; // 更新路径
                }
            }
        }
    }
}

BFS(广度优先搜索)

  1. 介绍

    • BFS是一种图搜索算法,可以用于求解无权图或所有边的权值都相同的图中的最短路径问题。
    • 算法通过逐层扩展节点来搜索图中的路径。
  2. 特点

    • 适用于无权图或所有边的权值都相同的图。
    • 通过队列实现节点的逐层扩展。
    • 在无权图中,BFS可以找到从起点到终点的最短路径(边数最少)。
  3. 代码实现(JavaScript示例):

function BFS_MIN_Distance(G, u) {
    let d = new Array(G.vexnum).fill(-1); // 初始化路径长度
    let path = new Array(G.vexnum).fill(-1); // 最短路径从哪个顶点过来
    let visited = new Array(G.vexnum).fill(false); // 访问标记
    let Q = []; // 队列

    d[u] = 0;
    visited[u] = true;
    Q.push(u);

    while (Q.length > 0) {
        let current = Q.shift();
        for (let w = G.FirstNeighbor(current); w >= 0; w = G.NextNeighbor(current, w)) {
            if (!visited[w]) {
                d[w] = d[current] + 1;
                path[w] = current;
                visited[w] = true;
                Q.push(w);
            }
        }
    }

    return { d, path };
}

区别

  1. 适用范围

    • 迪杰斯特拉算法适用于有向图和带非负权值边的图。
    • 弗洛伊德算法适用于带有任意权值边的图。
    • BFS适用于无权图或所有边的权值都相同的图。
  2. 算法类型

    • 迪杰斯特拉算法是单源最短路径算法。
    • 弗洛伊德算法是多源最短路径算法。
    • BFS是一种图搜索算法,但在无权图中可用于求解最短路径。
  3. 时间复杂度

    • 迪杰斯特拉算法的时间复杂度为O(V^2),其中V是顶点数。
    • 弗洛伊德算法的时间复杂度为O(V^3)。
    • BFS的时间复杂度取决于图的边数和节点的扩展速度,通常与图的规模和结构有关。O(V^2)或者O(V+E)

标签:int,路径,迪杰,BFS,++,算法,顶点
From: https://blog.csdn.net/buwangchuxinking/article/details/143747187

相关文章

  • 代码随想录算法训练营 | 所有可达路径
    所有可达路径文章链接:https://programmercarl.com/kamacoder/0098.所有可达路径.html#本题代码题目链接:https://kamacoder.com/problempage.php?pid=1170#include<iostream>#include<vector>usingnamespacestd;//全局路径vector<vector<int>>paths;vector<in......
  • c语言第九课,各种算法
    选择排序选择排序(从未排序列找到最值,放到排序序列的起始位置)#include<stdio.h>voidselect_sort(inta[],intn)//定义选择排序函数{  for(inti=0;i<n-1;i++)//遍历数组找到最小的元素索引,n-1是因为最后一次可以排序两个  {    intmin=i;//假......
  • 洛谷题单 算法2-2 常见优化技巧
    洛谷题单算法2-2常见优化技巧单调栈单调栈最经典的应用,就是在一个数列里寻找距离元素最近的比其大/小的元素位置。模板题,寻找每个元素右边第一个比它大的元素下标。stack<int>s;for(inti=n;i>=1;i--){while(s.size()&&a[s.top()]<=a[i])s.pop();f[i]=s.......
  • 非煤矿山算法智慧矿山一体机提升机危险区域违规闯入识别边坡监测预警系统详述
    在矿山行业中,安全始终是最为关键的议题。随着智能化技术的发展,智慧矿山一体机应运而生,它专为矿山安全监控和管理设计,集成了多种智能化功能,以提升矿山的安全监管能力和生产效率。这款设备不仅能够满足矿山场景下的视频智能化建设需求,还能够通过边缘计算技术实现对矿山安全风险的实......
  • 【算法学习】单调队列优化dp
    前言这已经是很基础很模板化的优化了,我们可以理解为用贪心的思路去掉了永远不可能用到的状态,通常用于长度固定是个区间、最大值且满足单调性的题目。如果一个选手比你小,还比你强,你就永远也打不过他了。这很残酷但这也是单调队列的思想,虽然现实情况比较多变。P3572[POI2014]PT......
  • 街面环卫算法视频分析服务器沿街晾晒智慧城管算法详解
    在城市精细化管理的背景下,智慧城管和街面秩序维护的需求日益增长。为了提高城市管理效率,确保城市秩序和市容市貌,一款集高清视频监控、智能分析与告警、数据资源共享服务于一体的智能化一体机设备应运而生。本文将详细介绍街面环卫算法视频分析服务器的功能特点以及其在智慧城管和......
  • 视频智能分析网关视频分析网关工服检测算法:提升安全监管效率的关键技术
    随着AI技术的持续发展,智能视频分析网关已经成为多个行业安全监控的关键设备。在这些网关中,工服检测算法作为一项关键技术,利用深度学习和计算机视觉技术,能够实时监控并分析监控视频中工作人员的工服穿着情况。本文将详细分析视频智能分析网关视频分析网关的工服检测算法,并探讨其在......
  • 烟火检测视频分析网关算法网关智慧工厂安全生产视频监管方案
    在数字化时代,企业转型升级已成为实现可持续发展的必由之路。特别是在工业领域,工厂的智能化转型不仅能够提高生产效率,还能加强安全管理,确保员工的健康与安全。TSINGSEE青犀AI智能分析网关V4与安防监控视频管理系统EasyCVR视频融合平台的结合,为工厂提供了一个实现智能化转型、构建智......
  • 百万数据做支撑,智能算法赋能标准查重工作全面升级
    标准查重—快速检查标准重复度—在标准编制过程中,查重工作是确保标准质量、维护其科学性与原创性的重要环节。例如,在编制某一特定行业的产品质量标准时,需要与该行业已有的国家、行业、地方标准进行全面比对,查看是否存在重复条款、相似表述等情况。尤其是在全球化背景下,很多......
  • 代码随想录算法训练营第二十四天| leetcode93.复原IP地址、 leetcode78.子集、leetcod
    1leetcode93.复原IP地址题目链接:93.复原IP地址-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法如何分割字符串并判断是合法IP?|LeetCode:93.复原IP地址_哔哩哔哩_bilibili思路:就是将这个字符串符合要求的进行一个收集,然后使用列表存储,最后使用join函数将这个列表进行连......