日日算法:Dijkstra算法
介绍
Dijistra
算法作为一种最短路径算法,可以用来计算一个节点到图上其他节点的最短距离。
主要是通过启发式的思想,由中心节点层层向外拓展,直到找到中点。
适用于无向图和有向图。
算法思想
- 假设我们要计算节点
A
到其它节点的最短距离 - 引入两个集合(
S
,U
),其中集合S
表示已经求出最短路径的点(以及最短距离),集合U
表示还未求出最短路径的点。集合中的元素用类似A(0)
形式表示,其中A
目标点为A
,(0)
表示目前已知最短路径为0
(未直接连通的距离用∞
表示)。 - 初始时,
S
集合中只有起始点,距离为0
,U集合中除了直接与A
点连通的点外,距离都为∞
。 - 第一次向外拓展,找出
U
集合中距离最短的点(假设为B
)加入集合S
。并以B
点向外拓展,更新U
集合中的距离值。更新规则为,如果经过B
到某点的距离小于U
集合中记录的结果,那么则更新中集合U
中该点的距离值。 - 每执行一次步骤四,我们可以得出
A
点距某个点的最短距离。 - 重复步骤四,直到
U
的集合为空或是目标点不在U
集合中,也就计算出了需要的最短距离。
用图表示解题过程:
证明
同样以上图为例,我们如何保证第一次选择得到结果A-> B (6)
是正确的最优解。
证明:
- 上述图为无向图,且不存在负权边。
- 由A出发去其他点,穷举第一条边所有选择,只能为
A -> B(6)
,A -> C(12)
和A -> D(8)
三种。一旦第一条边选择了后两种情况,经过C
或是D
点再绕回B
,由于不存在负权边,那么经过C
的路线一定大于A->C(12)
,经过D
的路线A->D(8)
,因此都会大于A ->B(6)
。 - 那么为什么第二次选择只能确定
D
而非刚更新了最小值的E
点。首先基于上一步我们确定了由A
出发去D
点最短路径第一条边只可能是A->B
和A->D
两种情况,而经过B
点再选择第二条边也在上轮计算过了,其与第一条边之和均大于A->D(8)
,所以能够确定到D
的最短路径。而由于D->E
的最短路径在第二轮尚不知道,因此无法确定到E
的最短路径。 - 同理,可以确定每一轮的解都是最短路径。
算法实现
public class Dijkstra {
public static int[] getShortestPath(int[][] graph, int source){
if(graph == null || graph.length <= source)
throw new IllegalArgumentException();
if(graph.length != graph[0].length)
throw new IllegalArgumentException();
int n = graph[source].length;
// String[] route = new String[n];
//保存结果集
int[] ret = new int[graph[source].length];
//保存已确定最短路径的点
int[] visited = new int[graph[source].length];
//初始化数据
Arrays.fill(visited, 0);
Arrays.fill(ret, Integer.MAX_VALUE);
ret[source] = 0;
//进行n次筛选
for(int i=0; i<n; i++){
//找出结果集中未visited结果中数据最小的点,为该轮确定的最短路径
int minValueIndex = findMinValue(ret, visited);
visited[minValueIndex] = 1;
//更新通过该点是否有新的最短路径生成
int[] line = graph[minValueIndex];
for(int j=0; j<line.length; j++){
if(visited[j] == 0 &&
line[j] != Integer.MAX_VALUE &&
line[j] + ret[minValueIndex] <= ret[j]){
ret[j] = line[j] + ret[minValueIndex];
}
}
}
return ret;
}
private static int findMinValue(int[] source, int[] visited){
int ret = 0;
int minVal = Integer.MAX_VALUE;
for(int i=0; i<source.length; i++){
if(visited[i] == 0 && source[i] < minVal){
ret = i;
minVal = source[i];
}
}
return ret;
}
}
上述代码见Github。
日日算法:Dijkstra算法的更多相关文章
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- HDU1535——Invitation Cards(最短路径:SPAF算法+dijkstra算法)
Invitation Cards DescriptionIn the age of television, not many people attend theater performances. A ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 最短路径算法——Dijkstra算法
在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...
- 单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)
一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...
- 最短路径算法——Dijkstra算法与Floyd算法
转自:https://www.cnblogs.com/smile233/p/8303673.html 最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ...
- 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)
一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...
- 最短路-Prim算法 dijkstra算法
HDU-1233 #include <iostream> #define INF 1000000 using namespace std; ][]; ]; ]; ]; ]; int mai ...
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- 有向有权图的最短路径算法--Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...
随机推荐
- 1055 The World's Richest (25分)(水排序)
Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...
- 存储机制 cookie session jwt token
cookieCookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网 ...
- Blocked Billboard II题解--模拟到崩溃的模拟
前言 比赛真的状态不好(腐了一小会),导致差点爆0. 这个题解真的是在非常非常专注下写出来的,要不然真的心态崩. 题目 题目描述 奶牛Bassie想要覆盖一大块广告牌,她在之前已经覆盖了一小部分广告牌 ...
- awk扩展应用
awk扩展应用 案例1:使用awk提取文本 案例2:aw ...
- Win 10 C 盘突然爆满,怎么清理?
Win 10 C 盘突然爆满,怎么清理? 使用windows的小伙伴们都知道,C盘是安装系统的,有时候不知道为啥突然就爆满了,查看我的电脑,C盘显示红色的.是不是感觉狠揪心,想删除一些东西有不敢删除, ...
- javascript入门 之 zTree(十二 托拽事件(二))
1.逻辑可能有不完善的地方,如果发现,请指出. <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - d ...
- matplotlib locators
2020-03-23 17:59:59 -- Edit by yangray The Locator class is the base class for all tick locators. Th ...
- 二、Python2.7的安装并与Python3.8共存
一:Python解释器为什么要2个版本? 众所周知,Python2.7是一个过渡版本. 很多公司写的项目并不是基于最新的Python3写的,在之后进行一些项目更改的时候,Python3的语法有一些并不 ...
- MySQL exists的用法
有一个查询如下: 1 SELECT c.CustomerId, CompanyName 2 FROM Customers c 3 WHERE EXISTS( 4 SELECT OrderID FROM ...
- 关于node中两个模块相互引用却不会死循环的问题
关于node中两个模块相互引用却不会死循环的问题 node中是通过require来导入加载模块的,require有两个作用: 1.加载文件模块并执行里面的代码 2.拿到被加载文件模块导出的接口对象 现 ...