首页 > 编程语言 >Dijkstra算法

Dijkstra算法

时间:2024-08-11 14:25:17浏览次数:13  
标签:int 路径 算法 Dijkstra 顶点 dis

Dijkstra算法是一种用于在加权图中寻找单源最短路径的算法。它由荷兰计算机科学家Edsger Dijkstra在1956年提出。

该算法基于贪心策略,通过不断选择当前最短路径上的顶点来逐步确定最短路径。它使用一个距离数组来记录起始点到每个顶点的距离,并使用一个集合来存储已经求得最短路径的顶点。

Dijkstra算法的步骤如下:

1. 初始化距离数组,将起始点的距离设置为0,将其他点的距离设置为无穷大。
2. 将起始点加入集合中。
3. 对集合中的每个顶点,计算其到未访问顶点的距离,并更新距离数组。
4. 选择距离数组中值最小的顶点作为下一个要访问的顶点,并将其从集合中移除。
5. 重复步骤3和步骤4,直到集合为空。
6. 返回最终的距离数组。

Dijkstra算法的特点是能够处理边权值为正的有向图或无向图。它的时间复杂度为O(V^2),其中V为顶点的数量。在使用最小堆等数据结构优化后,可以将时间复杂度降低到O((V+E)logV),其中E为边的数量。

总结来说,Dijkstra算法是一种求解单源最短路径问题的有效算法,它通过贪心策略不断选择当前最短路径上的顶点来逐步确定最短路径。

Dijkstra算法是一种用于找到图中从一个顶点到其他所有顶点的最短路径的算法。它具有以下优点和缺点:

优点:
1. 算法确保找到所有的最短路径:Dijkstra算法能够找到从起始顶点到所有其他顶点的最短路径,并且保证这些路径是实际的最短路径。
2. 算法适用于有向和无向图:Dijkstra算法可以用于有向图和无向图,可以处理复杂的图结构。
3. 算法的时间复杂度较低:在使用适当的数据结构(如最小堆)和优化技巧(如提前终止)的情况下,Dijkstra算法的时间复杂度可以降低到O((V+E)logV),其中V是顶点数,E是边数。

缺点:
1. 算法不适用于大规模图:当图非常大时,Dijkstra算法的性能可能会下降,因为需要对所有的节点进行扫描和更新。
2. 算法需要额外的空间:Dijkstra算法需要使用额外的数据结构(如距离数组和前驱数组)来存储每个顶点的最短路径和前驱顶点,因此需要额外的空间来存储这些信息。
3. 算法依赖于边权重非负:Dijkstra算法的前提是边的权重必须是非负的,否则算法可能会产生错误的结果。如果边的权重存在负值,应该使用其他算法(如贝尔曼-福特算法)。

下面是实现Dijkstra算法的代码

#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
#define KUI ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
struct jgt
{
    int go;
    int d;
};
const int con = 1e5 + 4;
int n, m, k;
bool vis[con];
int dis[con];
void take()
{
    cin >> n >> m;
    memset(dis, 127, sizeof dis); // 将dis赋值为较大数;
    vector<struct jgt> v[n + 1];
    int a1;
    struct jgt ans;
    for (int i = 1; i <= m; i++)
    {
        cin >> a1 >> ans.go >> ans.d;
        v[a1].push_back(ans); // 存图路径;
    }
    dis[1] = 0; // 1为根节点,距离为0;
    for (int i = 1; i <= n; i++)
    {
        k = 0;
        // 寻找未走过的距离最短的节点;
        for (int j = 1; j <= n; j++)
        {
            if (vis[j] == 0 && dis[j] < dis[k])
            {
                k = j;
            }
        }
        // 走最短点,标记为1;
        vis[k] = 1;
        // 更新路径;
        for (auto &x : v[k])
        {
            if (dis[x.go] > dis[k] + x.d)
            {
                dis[x.go] = dis[k] + x.d;
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        cout << dis[i] << endl;
    }
}
int main()
{
    KUI;
    int t1 = 1;
    // cin >> t1;
    while (t1--)
    {
        take();
    }
    return 0;
}

标签:int,路径,算法,Dijkstra,顶点,dis
From: https://blog.csdn.net/xcc134679/article/details/141104993

相关文章

  • 图像分割算法
    5.1阈值分割(Thresholding)介绍阈值分割是一种简单而有效的图像分割方法,通过设置一个或多个阈值,将图像分割为前景和背景区域。常见的阈值分割方法包括全局阈值、自适应阈值和Otsu阈值。原理阈值分割通过比较像素值与设定的阈值,将像素分类为前景或背景。公式在阈值分割......
  • 499 道 Java 面试题 (附答案):JVM+ 分布式 + 算法 + 锁 +MQ
    Spring如何管理事务的。Spring怎么配置事务(具体说出一些关键的xml元素)。说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。Springmvc中DispatcherServlet初始化过程。netty......
  • 7-2广告算法业务
    1.两种广告广告按其投放目的可以分成两类:效果广告和品牌广告。效果广告是为了直接提升某个产品的用户数量或者销售收入。而品牌广告则是为了通过提升品牌知名度美誉度从而间接带来该品牌产品用户和销售收入的增长。大家所熟悉的互联网广告大部分都是效果广告。如:微信的朋......
  • Day25 第七章 回溯算法part04 回溯终章
    目录任务491.递增子序列思路46.全排列思路47.全排列II思路心得体会任务491.递增子序列给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序......
  • 7-1推荐算法业务
    1.推荐算法业务入门搜索和推荐搜索是人找物,而推荐是物找人。搜索一般用来满足用户比较明确的需求,而推荐则可以用来满足用户相对模糊的需求。大家熟悉的推荐系统包括抖音短视频、今日头条新闻推荐、网易云音乐每日推荐、淘宝京东的猜你喜欢推荐、B站的视频推荐等等。大家熟......
  • 基于模拟退火算法求解旅行商(TSP)问题(附word文档)
    基于模拟退火算法求解旅行商(TSP)问题(附word文档)......
  • 【Java毕设选题推荐】基于SpringBoot的协同过滤算法美食推荐小程序
    前言:我是IT源码社,从事计算机开发行业数年,专注Java领域,专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务......
  • 混合策略改进的蜣螂算法(IDBO)优化BP神经网络
    目录0引言1数学模型2模型对比3matlab代码3.1改进的主代码3.2IDBO-BP4视频讲解0引言针对DBO算法全局探索能力不足、易陷入局部最优以及收敛精度不理想等问题,多为学者提出了混合多策略改进的蜣螂优化算法(IDBO)。主要混合策略改进首先是采用混沌映射结合随机反向......
  • 算法题系列4
    请设计一个文件缓存系统,该文件缓存系统可以指定缓存的最大值(单位为字节)。文件缓存系统有两种操作:存储文件(put)和读取文件(get),操作命令为putfileNamefileSize或者getfileName,存储文件是把文件放入文件缓存系统中;读取文件是从文件缓存系统中访问已存在的文件,如果文件不存在......
  • 算法的时间复杂度和空间复杂度
    算法的复杂度        算法在运行时需要耗费的时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。时间复杂......