dijkstra算法,真的不能计算负权值吗?

很多人都知道dijkstra算法不能计算负权值。
但是不是所有人都深刻地认识了这一原因。
以下面的例子为例:
dijkstra算法,真的不能计算负权值吗?_第1张图片
如果用dijkstra算法来计算最短路径,一定会出错。
因为按照dijkstra算法,它的原则是基于贪心进行查找,所以它的查找顺序应该是:BEDC。

造成的结果就是:找到第二个节点时,就会直接判断E的最短路径为-3.并且后续节点的查找也不会改变这个值。

但是显然,我们知道E的最短路径为-4.

出现这种情况的根本原因是,负环(含负值的环)出现。导致贪心的查找逻辑无法继续成立。

用通俗的话来说,就是面对负权值的环时,算法在查找时容易”鼠目寸光“,很简单的下定结论。

但是,这并不意味着,dijkstra算法一定无法在负值情况下生效。

比如下面的情况,没有出现负环。

dijkstra算法,真的不能计算负权值吗?_第2张图片
在这种情况下,djikstra算法就能正常工作,并且不受负权值影响。

它的查找顺序应该是:BCDE。而CD由于没有与E形成环,所以负权值就不再会破坏算法平衡,成为了一个表示大小的数字。

最后的结果显然是0.虽然这只是一个例子,但是我们可以很容易的想到,只要不出现负环,任何一个负权值图我们都可以用这种方法计算。

换而言之,dijkstra算法真正的问题是无法计算负环而不是负权值。所以我们也可以把它用在一些不出现负环的负权值问题上。

比如一些题目甚至会暗示你。

试题 算法训练 最短路

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式
第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2

很显然,这道题就可以考虑用dijkstra或者SPFA算法进行求解。

你可能感兴趣的:(个人题解心得,算法,数据结构,贪心算法,dijkstra)