弗洛伊德(Floyd)演算法比較N個數之間的大小

2021-08-03 10:48:51 字數 1581 閱讀 5644

關於floyd(弗洛伊德)演算法第一次接觸是在資料結構課程中,當時關於圖的最短路徑的生成裡面介紹了兩種方面,一種是dijkstra演算法,可以得到單個節點到其他節點的最短路徑。另一種就是floyd演算法。

提到這裡,就介紹一下兩者的區別,dijkstra演算法是採用貪心思想,每次都找到乙個距離目標節點最短的節點,通過該節點更新資訊,從而得到所有節點距離目標節點的距離。而floyd演算法則是採用動態規劃的思想,如果節點a和節點b通過節點c的距離小於節點a,b之間的直接距離,即dis(a,b) > dis(a,c) + dis(c,b),則更新dis(a,b)。

但是最近碰到了這樣的一類題,給定輸入對(a1, a2),輸入對前面的元素大於輸入對後面的元素,目前有n個元素,同時有m個輸入對。判斷是否可以通過這m個輸入對來判斷a1,a2,….an之間的大小關係。

比如說網易的一道題:

*小明陪小紅去看鑽石,他們從一堆鑽石中隨機抽取兩顆並比較她們的重量。這些鑽石的重量各不相同。在他們們比較了一段時間後,它們看中了兩顆鑽石g1和g2。現在請你根據之前比較的資訊判斷這兩顆鑽石的哪顆更重。

給定兩顆鑽石的編號g1,g2,編號從1開始,同時給定關係陣列vector,其中元素為一些二元組,第乙個元素為一次比較中較重的鑽石的編號,第二個元素為較輕的鑽石的編號。最後給定之前的比較次數n。請返回這兩顆鑽石的關係,若g1更重返回1,g2更重返回-1,無法判斷返回0。輸入資料保證合法,不會有矛盾情況出現。

測試樣例:

2,3,[[1,2],[2,4],[1,3],[4,3]],4

返回: 1*

開始碰到了想了下,當時想法是用類似森林的結構,通過節點父子關係來記錄大小關係,如果不在乙個樹中說明大小關係無法判斷,但是這種方式實現起來感覺很麻煩,後來發現居然還有這種操作,可以用圖來記錄它們之間的大小關係,如果節點a有指向節點b的邊,就說明a大於b,也就是說用乙個有向圖來記錄大小關係,如果節點a可達到節點b,就說明a大於b。圖可以用二維陣列來儲存節點間關係,如果m[i][j]==1,就說明i可以到達j,i>j。如果m[j][i] == 1,就說明j可以到達i,j>j。如果兩種都不滿足,就說明i,j之間的大小關係無法判斷。這兩節點處於兩個連通分量中。

這裡floyd主要用來更新i,j之間的可達關係的,也就是說如果m[i][k] == 1 && m[k][j] == 1,這說明節點i可以通過節點k到達節點j。

下面是**:

public

intcmp(int g1, int g2, int records, int n)

if(m < records[i][1])

}int cmpval = new

int[m][m];//記錄可達關係

for(int i = 0; i < m; i++)else}}

for(int i = 0; i < n; i++)

//floyd演算法,更新通過節點k的可達情況

for(int k = 0; k < m; k++)}}

}if(cmpval[g1 - 1][g2 - 1] == 1)else

if(cmpval[g2 - 1][g1 - 1] == 1)else

}

floyd時間複雜度o(m^3),空間複雜度o(m^2)

弗洛伊德(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 的路徑的長度,取其中較短...