[C语言算法]关于计算图中最短路径时的带负权情况

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C语言算法]关于计算图中最短路径时的带负权情况相关的知识,希望对你有一定的参考价值。

1,首先最短路径这个东西我觉得就不应该有负权的情况,比如A B权值为负,那么AB最短路径为ABABABABABABABAAB... ...B对吧,还是说有限制条件,每个点或者每个边只能走一次?

2,迪杰斯特拉不能求负权的情况我已知道,但是弗洛伊德我感觉一样不能求啊,比如简单的
0 -1 M
-1 0 -1
M -1 0
弗洛伊德怎么求?

3,贝尔曼福德算法中说,如果包含回路,且回路的权值和为正的,那么去掉这个回路,可以得到更短的路径
如果回路的权值是负的,那么肯定没有解了,为什么没有解了?难道这个环路可以无限循环下去???

求告知!

参考技术A 最短路径用Bellman-ford可以求负值且能判断出是否有负环,如果有负环因为会无限循环所以求不出。第一二问都是负环吧追问

这不是无向图吗,,,你是说,全部当做有向图来理解的基础上,不能出现环是吗?

请看这是某位大神的解答:
比如n=3,邻接矩阵:
0,3,4
3,0,-2
4,-2,0
用dijkstra求得d[1,2]=3,事实上d[1,2]=2,就是通过了1-3-2使得路径减小。

这难道不是环吗?望告知,我已经彻底迷糊了

追答

DIJ算法不能计算存在负权的边。总结,没有负权的就能用DIJ,没有负环的就能用Bellman-ford(但能判断是否存在负环)。

追问

我已经明白了,关键应该是,一个无向图中出现负值,就相当于出现环了,对吗

追答

不是吧,所谓的负环是指一个环类似A到B,B到C,C又能回到A,此路径权值之和为负的,这就叫作负环,因为走一圈是负的,所以可以无限循环走下去

最短路径心得

Dijkstra Algorithm:解决无负权边带权有向图/无向图的单源最短路。

 

Bellman-Ford Algorithm:解决含负权边带权有向图的单源最短路。

不能处理带负权边的无向图。(因为可以来回走一条负权边)

图中不能包含权值总和为负值的回路。(负权值回路)

 

Dijkstra Algorithm

Dijkstra算法在求解过程中,源点到集合P内各顶点的最短路径一旦求出,则之后不变了,修改的仅仅是源点到P外各顶点的最短路径长度.

Bellman-Ford Algorithm

Bellman-Ford算法在求解过程中,每次循环都要修改所有顶点的dist[ ],也就是说源点到各顶点最短路径长度一直要到算法结束才确定下来.

 

 SPFA Algorithm 

优化过的Bellman-Ford Algorithm。

快速求解含负权边有向图的单源最短路。

可以用SPFA判断图有无负权环。

 

 

以上是关于[C语言算法]关于计算图中最短路径时的带负权情况的主要内容,如果未能解决你的问题,请参考以下文章

spfa 算法模板 可求带负权边的最短路

SPFA算法_带负权边的单源最短路径

dijkstra算法学习

算法模板之SPFA

最短路径 Dijkstra 算法为啥边上的权值非负阿?

Bellman_Ford和SPFA:带负边权的单源最短路算法