內容會持續更新,有錯誤的地方歡迎指正,謝謝!
是一種利用鄰接矩陣記錄每兩點間的最短路徑以在沒負迴路的有向圖中找到最短路徑的演算法。
求最短路的floyd演算法框架:
宣告乙個二維陣列(官方叫:鄰接矩陣),用於將有向圖轉化為這個二維陣列matrix,如何轉化?
先將對角線上的元素置0,非對角線上元素置無窮大;
再將圖中互相相連的兩點的距離寫入到二維陣列中;比如點1到點2的距離為3,則matrix[0][1] = 3;
floyd登場:見下方floyd分析板塊
floyd分析:
整個演算法雖然感覺很麻煩,但其實**實現卻非常簡單,核心**只有五行:
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
//k為中轉點,matrix[i][k]表示從i到k的路徑長度
if(matrix[i][j]>
matrix[i][k]+matrix[k][j])
matrix[i][j]=matrix[i][k]+matrix[k][j];
這五行**的基本思想:傳遞思想,或叫中轉思想。最開始k=1,只允許經過1號頂點(必須經過1號頂點)進行中轉;接下來k=2,允許經過1和2號頂點(必須經過2號頂點)進行中轉……最後k=n,允許經過1~n號所有頂點(必須經過n號頂點)進行中轉,便可求得任意兩點之間的最短路程,至於經不經過除k號頂點以外的頂點,要根據實際輸入和每條路徑的最短長度的計算結果而定。
用一句話概括:最短路徑是從i號頂點到j號頂點只經過前k號點且必經過第k號結點的最短路程。
其實這是一種動態規劃的思想,動態規劃的特徵有兩個:
最優化問題;
把大問題轉化為一系列互相有關係的子問題,子問題的求解依賴於其它子問題的解。
動態規劃總結:就是根據每步計算的結果一步步地構造出了最優解決方案。
請見鏈結裡文章的後半部分
題目
小明陪小紅去看鑽石,他們從一堆鑽石中隨機抽取兩顆並比較她們的重量。這些鑽石的重量各不相同。在他們們比較了一段時間後,它們看中了兩顆鑽石g1和g2。現在請你根據之前比較的資訊判斷這兩顆鑽石的哪顆更重。
給定兩顆鑽石的編號g1,g2,編號從1開始,同時給定關係陣列vector,其中元素為一些二元組,第乙個元素為一次比較中較重的鑽石的編號,第二個元素為較輕的鑽石的編號。最後給定之前的比較次數n。請返回這兩顆鑽石的關係,若g1更重返回1,g2更重返回-1,無法判斷返回0。輸入資料保證合法,不會有矛盾情況出現。
輸入例子:2,3,[[1,2],[2,4],[1,3],[4,3]],4
輸出例子:1
分析
依然是floyd演算法的應用,與上個例子的不同點是初始值不同、if條件不同,思路如下:
鑽石之間的重量關係是乙個有向無環圖,可宣告乙個二維陣列(即鄰接矩陣),陣列元素的兩個索引分別代表前乙個和後乙個鑽石的重量,陣列元素是1代表前乙個鑽石的重量大於後乙個鑽石,是0代表尚未發現前後兩個鑽石之間的關係。那麼,如何將關係轉化為陣列?
將對角線上的元素置1,表示自己可到自己;非對角線上的元素置0,表示某點不可到某點;
根據已有的比較關係,將可比較(即第乙個元素可到第二個元素)的兩點對應的元素置1,比如:若有[2,1],那2比1重,則有matrix[2][1]=1;
floyd登場:三個for迴圈,if(matrix[i][k]==1&&matrix[k][j]==1) matrix[i][j]==1;
一波帶走!
**
class cmp
int matrix[maxnum+1][maxnum+1];//多申請乙個或幾個空間,以便從1開始,更直觀。
for(i=1;i<=maxnum;++i)
for(j=1;j<=maxnum;++j)
for(i=0;i//此時i應初始化為0,判斷上界為matrix[records[i][0]][records[i][1]]=1;
for(k=1;k<=maxnum;++k)
for(j=1;j<=maxnum;++j)
for(i=1;i<=maxnum;++i)
if(matrix[i][k]==1&&matrix[k][j]==1)
matrix[i][j]=1;
if(matrix[g1][g2]==1)
return
1; else
if(matrix[g2][g1]==1)
return -1;
return
0; }
};
比較重量 Floyd
題目 從一堆鑽石中隨機抽取兩顆並比較重量。這些鑽石的重量各不相同。在他們們比較了一段時間後,它們看中了兩顆鑽石g1和g2。給定兩顆鑽石的編號g1,g2,比較次數n,編號從1開始,同時給定關係陣列a n 2 第乙個元素為一次比較中較重的鑽石的編號,第二個元素為較輕的鑽石的編號。請返回這兩顆鑽石的關係,...
程式設計題 比較重量
小明陪小紅去看鑽石,他們從一堆鑽石中隨機抽取兩顆並比較她們的重量。這些鑽石的重量各不相同。在他們們比較了一段時間後,它們看中了兩顆鑽石g1和g2。現在請你根據之前比較的資訊判斷這兩顆鑽石的哪顆更重。給定兩顆鑽石的編號g1,g2,編號從1開始,同時給定關係陣列vector,其中元素為一些二元組,第乙個...
比較重量 網易2016實習研發工程師程式設計題
程式設計題 比較重量 小明陪小紅去看鑽石,他們從一堆鑽石中隨機抽取兩顆並比較她們的重量。這些鑽石的重量各不相同。在他們們比較了一段時間後,它們看中了兩顆鑽石g1和g2。現在請你根據之前比較的資訊判斷這兩顆鑽石的哪顆更重。給定兩顆鑽石的編號g1,g2,編號從1開始,同時給定關係陣列vector,其中元...