1. 程式人生 > >最短路徑演算法—Floyd(弗洛伊德)演算法分析與實現(Python)

最短路徑演算法—Floyd(弗洛伊德)演算法分析與實現(Python)

December 19, 2015 10:56 PM
Floyd演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理帶權有向圖或負權的最短路徑問題
解決此問題有兩種方法:
其一是分別以圖中每個頂點為源點共呼叫n次演算法;
其二是採用Floyd演算法。
兩種演算法的時間複雜度均為O(n3),但後者形式上比較簡單。

Floyd演算法的基本思想:
1. 利用二維陣列dist[i][j]記錄當前vi到vj的最短路徑長度,陣列dist的初值等於圖的帶權鄰接矩陣;
2. 集合S記錄當前允許的中間頂點,初值S=Φ;
3. 依次向S中加入v0 ,v1… vn-1,每加入一個頂點,對dist[i][j]進行一次修正:設S={v0 ,v1… vk-1},加入vk,則dist(k)[i][j] = min{ dist(k-1)[i][j],dist(k-1)[i][k]+dist(k-1)[k][j]}。dist(k)[i][j]的含義:允許中間頂點的序號最大為k時從vi到vj的最短路徑長度。
dist(n-1)[i][j]就是vi到vj的最短路徑長度。
這裡寫圖片描述

最短距離有三種情況:
1、兩點的直達距離最短。
2、兩點間只通過一箇中間點而距離最短。
3、兩點間用通過兩各以上的頂點而距離最短。
對於第一種情況:
在初始化的時候就已經找出來了且以後也不會更改到。
對於第二種情況:
弗洛伊德演算法的基本操作就是對於每一對頂點,遍歷所有其它頂點,看看可否通過這一個頂點讓這對頂點距離更短
對於第三種情況:
如下圖的五邊形,可先找一點(比如x,使=2),就變成了四邊形問題,再找一點(比如y,使=2),可變成三角形問題了(v,u,w),也就變成第二種情況了,由此對於n邊形也可以一步步轉化成四邊形三角形問題。(這裡面不用擔心哪個點要先找哪個點要後找,因為找了任一個點都可以使其變成(n-1)邊形的問題)。
這裡寫圖片描述

#Floyd.py
#王淵
#2015.12.17
#Email:[email protected]
from pylab import *

INFINITY = 65535                        #代表無窮大
D = array([[0,10,INFINITY,INFINITY,INFINITY,11,INFINITY,INFINITY,INFINITY],#鄰接矩陣
        [10,0,18,INFINITY,INFINITY,INFINITY,16,INFINITY,12],
        [INFINITY,18,0,22,INFINITY,INFINITY,INFINITY,INFINITY,8
], [INFINITY,INFINITY,22,0,20,INFINITY,INFINITY,16,21], [INFINITY,INFINITY,INFINITY,20,0,26,INFINITY,7,INFINITY], [11,INFINITY,INFINITY,INFINITY,26,0,17,INFINITY,INFINITY], [INFINITY,16,INFINITY,24,INFINITY,17,0,19,INFINITY], [INFINITY,INFINITY,INFINITY,16,7,INFINITY,19,0,INFINITY], [INFINITY,12,8,21,INFINITY,INFINITY,INFINITY,INFINITY,0]]) lengthD = len(D) #鄰接矩陣大小 p = list(range(lengthD)) P = [] for i in range(lengthD): P.append(p) P = array(P) for i in range(lengthD): for j in range(lengthD): for k in range(lengthD): if(D[i,j] > D[i,k]+D[j,k]): #兩個頂點直接較小的間接路徑替換較大的直接路徑 P[i,j] = P[j,k] #記錄新路徑的前驅 print(P) print(D)

相關推薦

演算法筆記---短路路徑Floyd()演算法

                                                                     最短路路徑之Floyd(弗洛伊德)演算法 Floyd-Wars

路徑演算法Floyd()演算法分析實現(Python)

December 19, 2015 10:56 PM Floyd演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理帶權有向圖或負權的最短路徑問題 解決此問題有兩種方法: 其一是分別以圖中每個頂點為源點共呼叫n次演算法; 其二是採用Floyd演算法

路徑演算法Floyd()演算法

Floyd演算法(解決任意兩點間的最短路徑,可以正確處理有向圖或負權值的最短路徑問題): 時間複雜度O(N3),空間複雜度O(N2); 演算法思想: Floyd演算法是一個經典的動態規劃演算法;首先我

路徑-Floyd()演算法

最短路徑-Floyd(弗洛伊德)演算法 簡介: 相較Dijkstra,Floyd是一個完全窮舉圖中每個點到末尾點的最短路徑 演算法思想: 按慣例說兩個工具 Path[MAX_SIZE][MAX_SIZE]:儲存所有的最短路徑(指向

結點對路徑Floyd演算法解析

        暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。         上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公

路徑演算法(3)—Floyd()演算法

Floyd-Warshall演算法,簡稱Floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為O(n^3)。 使用條件&範圍 通常可以在任何圖中使用,包括有向圖、帶負權邊的圖。 Floyd-Warshall 演算法用來找出每對點之間的

floyd()演算法,用於計算路徑

程式小白,希望和大家多交流,共同學習 //弗洛伊德(floyd)演算法,用於計算最短路徑 #include<iostream> #include<string> #include<iostream> #include<

路徑迪傑斯特拉演算法演算法實現

迪傑斯特拉演算法: 矩陣二位陣列矩陣T儲存頂點vi到各頂點的最短路徑值,初始狀態為鄰接頂點為弧的權值,非鄰接頂點為無窮大。陣列S用於儲存最短路徑,儲存單元為該弧的前驅頂點的下標和與前驅頂點之間的弧的權值。 1.從T中找出一條弧值最小的弧(vi,vj),將該弧加入S中,並根據vj的鄰接點vx更

圖的路徑之迪傑斯特拉演算法演算法

一、迪傑斯特拉(Dijkstra)演算法 1、定義描述   Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法的時

[從今天開始修煉資料結構]圖的路徑 —— 迪傑斯特拉演算法演算法的詳解Java實現

在網圖和非網圖中,最短路徑的含義不同。非網圖中邊上沒有權值,所謂的最短路徑,其實就是兩頂點之間經過的邊數最少的路徑;而對於網圖來說,最短路徑,是指兩頂點之間經過的邊上權值之和最少的路徑,我們稱路徑上第一個頂點是源點,最後一個頂點是終點。 我們講解兩種求最短路徑的演算法。第一種,從某個源點到其餘各頂點的最短路徑

Floyd()演算法 詳解+模板

弗洛伊德演算法介紹 和Dijkstra演算法一樣,弗洛伊德(Floyd)演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。 基本思想 通過Floyd計算

拓撲排序以及迪傑斯特拉演算法演算法的一些例子(天勤資料結構)

拓撲排序核心演算法     在一個有向圖中找到一個拓撲排序的過程如下:     1)從一個有向圖中選擇一個沒有前驅(入度為0)的頂點輸出;     2)刪除1)中的頂點,並刪除從該頂點出發的全部邊;  

floydwarshall演算法演算法)的理解,就一句話

floydwarshall algorithm(弗洛伊德演算法):對每一個頂點,都要嘗試它作為任一對頂點的中轉頂點的可能性。基於此,形成一個基礎資料庫。在這個基礎資料庫的基礎上,追溯出任意兩點的最短路徑。 對幾個疑問的解釋: 1.簡單的迴圈條件,如for (k=0;k&l

總結一下路徑演算法Floyd

看了好多大牛部落格,我把弗洛伊德演算法在這裡總結一下。 弗洛伊德演算法的介紹,先參考百度百科:Floyd演算法 再來幾篇可以參考的博文:http://www.wutianqi.com/?p=1903 http://www.cnblogs.com/biyeymyhjob/ar

路徑演算法(Floyd)

http://blog.csdn.net/ganze_12345/article/details/12164389自己寫的對於這篇文章的改進。怎麼說呢,之前我還認為是因為題目的問題所以要用這種笨方法,可是現在覺得完全是因為自己思維太狹隘了和基本知識的掌握不牢所致,現在通過網

路徑(鄰接矩陣)(演算法

#include<bits/stdc++.h> #define MaxInt 1e8 #define MVNum 100 #define OK 1 #define ERROR 0 using namespace std; typedef int VerTexType; typedef i

資料結構篇:校園路徑導航(二:演算法理解應用)

求最短路徑最常用的有迪傑斯特拉(Dijkstra)和弗洛伊德(Floyd)演算法兩種。本著簡潔為王道的信條,我選擇了Floyd演算法。 Floyd演算法 首先來看一個簡單圖,紅色標記代表在陣列的下標,橙色標記代表距離(邊權值) 我們用D[6][6]這個矩陣儲存兩點之間最短路徑,

演算法-----路徑演算法(一)

學習此演算法的原因:昨天下午遛彎的時候,碰到閨蜜正在看演算法,突然問我會不會弗洛伊德演算法?我就順道答應,然後用了半個小時的時間,學習了此演算法,並用5分鐘講解給她聽,在此也分享給各位需要的朋友,讓你們在最短的時間內,透徹的掌握該演算法。 Robert W. Floyd(

多源路徑演算法(java)不含具體路徑

  Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。   import java.util.Arrays; public class Florid

【原創】求路徑-演算法

有這樣一類題,它要求你從某個點出發,到某個為止走過的最短路徑。當然不會有這種題“從A點出發到B點”。一般來講,是這樣的題目“小明從重慶出發到北京,蘭後可以中轉3個城市,每個城市有1個機場或1條公路連