一、贝尔曼福特算法是在图中找各点距离顶点的最短路径,与Dijkstra不同的是,贝尔曼福特算法的边权可以为负数,而且贝尔曼福特算法除寻找最短路径之外还可以检测边权是否为负
二、①初始化图上所有点(除顶点外)到顶点的距离为无穷大(∞)顶点设为0
②最多进行n-1次操作(有可能更少),对各边进行松弛
松弛解释:
如图已知从5到1有两条路径1->3->5或 1->3->4->5,然而1->3->5的长度为 2+4=6,1->3->4->5的长度为2+1+2=5,1->3->4->5的长度较小,所以从5到1的最短距离为5
三、若要检测边权是否为负,只需遍历完之后,再遍历一遍,若顶点到节点的距离变为更小值,则边权存在负数
例题:
1378:最短路径(shopth)时间限制: 1000 ms 内存限制: 65536 KB 提交数: 7409 通过数: 3041 【题目描述】给出一个有向图G=(V, E),和一个源点v0∈V,请写一个程序输出v0和图G中其它顶点的最短路径。只要所有的有向环权值和都是正的,我们就允许图的边有负值。顶点的标号从1到n(n为图G的顶点数)。 【输入】第1行:一个正数n(2≤n≤80),表示图G的顶点总数。 |