[C语言算法]关于计算图中最短路径时的带负权情况
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C语言算法]关于计算图中最短路径时的带负权情况相关的知识,希望对你有一定的参考价值。
1,首先最短路径这个东西我觉得就不应该有负权的情况,比如A B权值为负,那么AB最短路径为ABABABABABABABAAB... ...B对吧,还是说有限制条件,每个点或者每个边只能走一次?
2,迪杰斯特拉不能求负权的情况我已知道,但是弗洛伊德我感觉一样不能求啊,比如简单的
0 -1 M
-1 0 -1
M -1 0
弗洛伊德怎么求?
3,贝尔曼福德算法中说,如果包含回路,且回路的权值和为正的,那么去掉这个回路,可以得到更短的路径
如果回路的权值是负的,那么肯定没有解了,为什么没有解了?难道这个环路可以无限循环下去???
求告知!
这不是无向图吗,,,你是说,全部当做有向图来理解的基础上,不能出现环是吗?
请看这是某位大神的解答:
比如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语言算法]关于计算图中最短路径时的带负权情况的主要内容,如果未能解决你的问题,请参考以下文章