Dijkstar和Flod,

2024-05-03 19:48
文章标签 flod dijkstar

本文主要是介绍Dijkstar和Flod,,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

几个最短路径算法的比较:
Floyd

       求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。
       Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题。

Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2)。

      Floyd-Warshall的原理是动态规划:
设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度。
若最短路径经过点k,则Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路径不经过点k,则Di,j,k = Di,j,k-1。
因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。

      在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
Floyd-Warshall算法的描述如下:
for k ← 1 to n do
  for i ← 1 to n do
    for j ← 1 to n do
      if (Di,k + Dk,j < Di,j) then
        Di,j ← Di,k + Dk,j;
其中Di,j表示由点i到点j的代价,当Di,j为 ∞ 表示两点之间没有任何连接。

 

Dijkstra

      求单源、无负权的最短路。时效性较好,时间复杂度为O(V*V+E)。
源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV)。
      当是稀疏图的情况时,此时E=V*V/lgV,所以算法的时间复杂度可为O(V^2) 。若是斐波那契堆作优先队列的话,算法时间复杂度,则为O(V*lgV + E)。

 

Bellman-Ford

      求单源最短路,可以判断有无负权回路(若有,则不存在最短路),
时效性较好,时间复杂度O(VE)。

Bellman-Ford算法是求解单源最短路径问题的一种算法。

      单源点的最短路径问题是指:
给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。

      与Dijkstra算法不同的是,在Bellman-Ford算法中,边的权值可以为负数。
      设想从我们可以从图中找到一个环路(即从v出发,经过若干个点之后又回到v)且这个环路中所有边的权值之和为负。那么通过这个环路,环路中任意两点的最短路径就可以无穷小下去。如果不处理这个负环路,程序就会永远运行下去。 而Bellman-Ford算法具有分辨这种负环路的能力。


SPFA

      是Bellman-Ford的队列优化,时效性相对好,时间复杂度O(kE)。(k<<V)。

与Bellman-ford算法类似,SPFA算法采用一系列的松弛操作以得到从某一个节点出发到达图中其它所有节点的最短路径。所不同的是,SPFA算法通过维护一个队列,使得一个节点的当前最短路径被更新之后没有必要立刻去更新其他的节点,从而大大减少了重复的操作次数。

      SPFA算法可以用于存在负数边权的图,这与dijkstra算法是不同的。

与Dijkstra算法与Bellman-ford算法不同,SPFA的算法时间效率是不稳定的,即它对于不同的图所需要的时间有很大的差别。

      在最好情形下,每一个节点都只入队一次,则算法实际上变为广度优先遍历,其时间复杂度仅为O(E)。另一方面,存在这样的例子,使得每一个节点都被入队(V-1)次,此时算法退化为Bellman-ford算法,其时间复杂度为O(VE)。

      SPFA算法在负边权图上可以完全取代Bellman-ford算法,另外在稀疏图中也表现良好。但是在非负边权图中,为了避免最坏情况的出现,通常使用效率更加稳定的Dijkstra算法,以及它的使用堆优化的版本。通常的SPFA算法在一类网格图中的表现不尽如人意。

这篇关于Dijkstar和Flod,的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957512

相关文章

Codeforces E. President and Roads (优先队列Dijkstar + 强连通 找必最短路上的必须边(桥))经典

E. President and Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Berland has n cities, the capital is located in

商店选址问题(dijkstar) 简直了,代改进!!!

商店选址问题Time Limit:10000MS  Memory Limit:65536KTotal Submit:388 Accepted:92 Case Time Limit:1000MS Description 给出一个城市的地图(用邻接矩阵表示),商店设在一点,使各个地方到商店距离之和最短。 Input 第一行为n(共有几个城市); N小于201 第二行至第n+1行为城市地图(用邻

城市问题(dijkstar)

城市问题Time Limit:10000MS  Memory Limit:65536KTotal Submit:255 Accepted:95 Case Time Limit:1000MS Description   设有n个城市,依次编号为0,1,2,……,n-1(n<=100),另外有一个文件保存n个城市之间的距离(每座城市之间的距离都小于等于1000)。当两城市之间的距离等于-1时

最短路径问题(dijkstar)

最短路径问题Time Limit:10000MS  Memory Limit:65536KTotal Submit:312 Accepted:160 Case Time Limit:1000MSDescription平面上有n个点(N<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点直线

本周图论的flod和dij算法

第一题 输入 #1 8 91 21 31 42 52 63 74 74 87 8 输出 #1 1 2 5 6 3 7 8 4 1 2 3 4 5 6 7 8 解读: 中规中矩的图论题,记得这个题需要排序,写一个dfs和bfs就好,要用到vis数组,还有这题可以直接用vector来存储节点信息,(vector是首要选择的数据结构),我们也可以为了插入节点方便

弗洛伊德算法 FLOD

int a[][] = { {0, 1000, 1000, 3, 5},{10, 0, 18, 1000,1000},{5, 1000, 0, 1000,1000},{1000,1000,2, 0, 1000},{1000,1000,2, 2, 0}}; 1.举个小栗子: 由上面两张图可知: a[1][3] 不可到达、a[1][0] = 10 、

8:map,flatMap,reduce,flod,scan,zip,iterator,stream,view,par,match

第十一章 数据结构(下)-集合操作 11.1 集合元素的映射-map 看一个实际需求   要求:请将 List(3, 5, 7) 中的所有元素都 * 2,将其结果放到一个新的集合中返回,即返回一个新的 List(6, 10, 14), 请编写程序实现。使用传统的方法解决 示例代码如下: package com.atguigu.chapter11.test/*** 要求:请将 List(3

POJ 2240 Arbitrage G++ floyd需复习 bellman_flod未实现 spfa未实现

#include <iostream>#include <map>#include <string>#include <cstring>using namespace std;//看博友分析 floyd实现 bellman_flod未实现 spfa未实现 map<string,int> mp;double da[40][40];int main(){int ta