判斷弗洛伊德 FLOYD演算法是不是有負環的

2021-08-08 03:26:48 字數 875 閱讀 1691

純屬個人看書後的想法,哪有不對請多多指點

首先模擬floyd求最短路徑的過程,擷取其中為環的部分,假設進入環時距離0(初始位置)的距離為5,然後訪問順序分別為1 2 3 4距離為1 2 3 -8如圖

首先距離1節點距離為5然後5+1距離二為6,距離3為6+2為8,然後4對應11,經過三圈迴圈之後他們分別對應的值如上。

最終結果為1 2 3 4分別對應1 2 4 7,然後我們觀察這4個資料 1+1=2  2+2 =4 4+3=7     7-8<1   !!!!不相等,也就是說無論floyd演算法在這個環中轉了多少次,總會有乙個出口,讓前邊那個值,加上路徑的長度,不等於它對應的下乙個值。而且如果為負環的話 一定是前邊的值例子中的7  -8  一定是小於 1對應的值的,因為  他的值是不斷減小的。

於是,判斷是否存在負環,可以把所有邊 i ,   j   , l    存起來,經過floyd演算法計算完之後,再分別對每乙個存在陣列中的值判斷,maze[0][i]+l是否小於 maze[i],如果小於則存在負環。

**如下

for (int i=0;icin>>x>>y>>tmp;

maze[x-1][y-1]=tmp;

temp t;

t.i=x-1;

t.j=y-1;

t.leth=tmp;

path.push_back(t);

}for (int i=0;ifor (int j=0;j}}

bool isloop=false;

for (int i=0;iif (maze[0][path[i].i]+path[i].leth

}if (isloop)

弗洛伊德(Floyd)演算法

弗洛伊德 floyd 演算法過程 用d v w 記錄每一對頂點的最短距離。依次掃瞄每乙個點,並以其為基點再遍歷所有每一對頂點d的值,看看是否可用過該基點讓這對頂點間的距離更小。演算法理解 最短距離有三種情況 兩點的直達距離最短。如下圖 兩點間只通過乙個中間點而距離最短。圖 兩點間用通過兩各以上的頂點...

弗洛伊德 Floyd 演算法

和dijkstra演算法一樣,弗洛伊德 floyd 演算法也是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名 弗洛伊德演算法 floyd 計算圖中各個頂點之間的最短路徑 迪傑斯特拉演算法用於計算圖中某乙...

弗洛伊德 Floyd 演算法

佛羅依德 floyd 演算法的基本思想 設圖g用鄰接矩陣法表示,求圖g中任意一對頂點vi與vj間的的最短路徑。1 將vi到vj的最短的路徑長度初始化為g.arcs i j adj,進行如下n次比較和修正 0 在vi與vj間加入頂點v0,比較 vi,v0,vj 和 vi,vj 的路徑的長度,取其中較短...