首页 > 其他分享 >Dijkstra

Dijkstra

时间:2024-08-03 21:50:47浏览次数:6  
标签:distance int graph 距离 Dijkstra visited 节点

Dijkstra

Dijkstra 算法的步骤中没有考虑负权重的边。如果图中存在负权重的边,应该使用其他算法,如 [[笔记/笔记杂记/Bellman-Ford]] 算法

算法步骤

  1. 初始化:创建一个距离数组 distance,用于记录从源节点到每个节点的距离,初始时将所有节点的距离设置为无穷大(表示不可达),将源节点的距离设置为0。同时创建一个集合  visited ,用于记录已经确定最短路径的节点。
  2. 选择最近节点:从未确定最短路径的节点中选择一个距离最小的节点,将其标记为已访问,并更新该节点相邻节点的距离。初始时,选择源节点作为最近节点。
  3. 更新距离:对于当前选定的最近节点,遍历其所有相邻节点。对于每个相邻节点,计算从源节点经过当前最近节点到达该相邻节点的距离。如果这个距离小于目前已知的最短路径距离,则更新该节点的距离。
  4. 重复步骤2和步骤3,直到所有节点都被标记为已访问,或者所有节点的距离都被确定为最短路径。
  5. 最短路径获取:根据最终计算得到的最短路径信息,可以通过回溯从目标节点向源节点遍历,获取最短路径

模板

private static final int INFINITY = Integer.MAX_VALUE;
/**
 * @param graph 邻接矩阵(节点间无边值为0)
 * @param s 源点
 * @return 源点s到其他点之间的距离(数组)
 */
int[] dijkstra(int[][] graph, int s) {
 int vertexCount = graph.length;
 int[] distance = new int[vertexCount];
 boolean[] visited = new boolean[vertexCount];
 for (int i = 0; i < vertexCount; i++) {
  distance[i] = INFINITY;
  visited[i] = false;
 }
 distance[s] = 0;

 while (true) {
  int v = findMinimumDistanceVertex(distance, visited);
  if(v == -1) break;
  
  visited[v] = true;
  for (int j = 0; j < vertexCount; j++) {
   if (!visited[j] 
    && graph[v][j] != 0 
    && distance[v] != INFINITY 
    && distance[v] + graph[v][j] < distance[j]) {

    distance[j] = distance[v] + graph[v][j];
   }
  }
 }
 return distance;
}
int findMinimumDistanceVertex(int[] distance, boolean[] visited) {
 int minDistance = INFINITY;
 int minDistanceVertex = -1;

 for (int i = 0; i < distance.length; i++) {
  if (!visited[i] && distance[i] < minDistance) {
   minDistance = distance[i];
   minDistanceVertex = i;
  }
 }

 return minDistanceVertex;
}

标签:distance,int,graph,距离,Dijkstra,visited,节点
From: https://www.cnblogs.com/licwuu/p/18341150

相关文章

  • dijkstra的封装模版
    /**-swj-*/>_____フ|__|/`ミ_xノ/|/ヽ?/ ̄|||||( ̄ヽ__ヽ_)_)\二つ**/#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;structDIJ{......
  • 图的最短路径算法(SPFA,Dijkstra,Bellman_Ford)(迪杰斯特拉算法,Spfa算法,贝尔曼-福特算
    目录Dijkstra迪杰斯特拉算法写法时间复杂度例题描述输入描述输出描述样例输入用例输出用例写法Spfa算法例题描述输入描述输出描述样例输入用例输出用例写法Bellman_Ford算法(贝尔曼-福特算法)写法例题描述输入描述输出描述样例输入样例输出样例......
  • 即使通过了示例测试用例,Dijkstra 算法也不起作用
    所以我遵循了维基百科关于Dijkstra算法和Brilliants的伪代码。https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Pseudocodehttps://brilliant.org/wiki/dijkstras-short-路径查找器/这是我的代码,它不起作用。谁能指出我的代码中的缺陷吗?#Usespyt......
  • (nice!!!)LeetCode 3112. 访问消失节点的最少时间(图论、边的dijkstra、堆优化)
    3112.访问消失节点的最少时间思路:节点n的个数非常大,用普通的dijkstra算法对节点进行枚举是会超时的,时间复杂度为0(n^2)。这里边的数量最大为10^5,可以对边使用dijkstra算法+堆优化操作,时间复杂度为0(mlogm)。节点消失问题,只需要加一个判断条件,判断到每个节点的最小时......
  • 代码随想录算法训练营第六十五天 | dijkstra(堆优化版)精讲、Bellman_ford 算法精讲、复
    dijkstra(堆优化版)精讲—卡码网:47.参加科学大会题目链接:https://kamacoder.com/problempage.php?pid=1047文档讲解:https://programmercarl.com/kamacoder/0047.%E5%8F%82%E4%BC%9Adijkstra%E5%A0%86.html思路当节点数多,边数少(稀疏图)时,可以考虑从边的角度出发,用堆来......
  • 参加科学大会-卡玛(堆优化版Dijkstra)
    学习参考:代码随想录与Prim类似,当节点数目较多,边的数量很小的时候(稀疏图),可以考虑从边的角度来求最短路,邻接矩阵遇到稀疏图,会导致申请过大的二维数组造成空间浪费且遍历边的时候需要遍历整个n*n矩阵,造成时间浪费。这时使用邻接链表明显更加符合需求。而在朴素版Dijk......
  • 基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
    1.程序功能描述     基于Dijkstra算法的最优行驶路线搜索matlab仿真,在一个实际城市路线图中,用鼠标点击起点和终点,通过算法完成路线搜索和规划。最后输出规划路线的长度。 2.测试软件版本以及运行结果展示MATLAB2022a版本运行        通过测试可以看出,Di......
  • Dijkstra算法理解-无人机路径规划
    1、理解Dijkstra算法是路径规划算法中非常经典的一种算法,在很多地方都会用到,特别是在机器人的路径规划中,基本学习机器人运动相关的都会接触到该算法。Dijkstra算法本身的原理是基于贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操......
  • C/C++ Dijkstra(迪杰斯特拉)算法详解及源码
    Dijkstra(迪杰斯特拉)算法是一种用于寻找带权重图中的最短路径的算法。它由荷兰计算机科学家EdsgerDijkstra于1956年提出,被广泛应用于网络路由算法和地图路线规划等领域。算法思想:初始化一个距离数组,用于保存起点到每个顶点的当前最短距离(初始时将起点距离设置为0,其他顶......
  • 最短路径问题——Floyd算法,dijkstra算法
    7-16最短路径算法(Floyd-Warshall)在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题。解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求出每一对顶点间的最短路径,执行的时间复杂度为O(n3)。而另一种算法是由弗洛伊德提出的,时间复杂度......