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

2021-09-28 23:46:54 字數 2116 閱讀 7831

在這篇部落格中我主要講解最短路徑演算法中的floyd演算法,這是針對多源最短路徑的乙個經典演算法。對於單源最短路徑演算法請詳見我的另一篇部落格:最短路徑演算法(上)——迪傑斯特拉(dijikstra)演算法

弗洛伊德(floyd)演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或有向圖或負權(但不可存在負權迴路)的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。

(一)演算法思想:

floyd演算法是乙個經典的動態規劃演算法。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋(這個詮釋正是動態規劃最富創造力的精華所在)。

從任意節點i到任意節點j的最短路徑不外乎2種可能,一是直接從i到j,二是從i經過若干個節點k到j。所以,我們假設dis(i,j)為節點u到節點v的最短路徑的距離,對於每乙個節點k,我們檢查dis(i,k) + dis(k,j) < dis(i,j)是否成立,如果成立,證明從i到k再到j的路徑比i直接到j的路徑短,我們便設定dis(i,j) = dis(i,k) + dis(k,j),這樣一來,當我們遍歷完所有節點k,dis(i,j)中記錄的便是i到j的最短路徑的距離。

(二)演算法過程

1)首先把初始化距離dist陣列為圖的鄰接矩陣,路徑陣列path初始化為-1。其中對於鄰接矩陣中的數首先初始化為正無窮,如果兩個頂點存在邊則初始化為權重   

2)對於每一對頂點 u 和 v,看看是否存在乙個頂點 w 使得從 u 到 w 再到 v 比己知的路徑更短。如果是就更新它。

狀態轉移方程為

如果 dist[i][k]+dist[k][j] < dist[i][j]

則dist[i][j] = dist[i][k]+dist[k][j]

//floyd演算法(多源最短路徑演算法) 

bool floyd()

this->path[i][j] = k;

}

}} }

return true;

}

我們用如下圖結構來演示floyd演算法:

全部**為:

#include #include #include #include using namespace std;
const int max = 65535;

class graph

this->g[i][i] = this->dist[i][i] = 0;

}cout>v2>>weight;

this->g[v1][v2] = this->g[v2][v1] = weight;

this->dist[v1][v2] = this->dist[v2][v1] = weight;} }

//floyd演算法(多源最短路徑演算法) 

bool floyd()

this->path[i][j] = k;

} }}

} return true; }

// 分治法尋找start到end最短路徑的中間結點

void find(queue &q ,int start,int end)

find(q,start,mid);

q.push(mid);

find(q,mid,end);

} //列印start頂點到end頂點的路徑

void print_path(int start,int end)

cout

cout

this->path[i][j] = k;

}

}} }

return true;

}

我們用如下圖結構來演示floyd演算法:

全部**為:

#include #include #include #include using namespace std;

最短路徑 弗洛伊德 Floyd 演算法

弗洛伊德 floyd 演算法 是解決任意兩點間的最短路徑的一種演算法 floyd演算法是乙個經典的動態規劃演算法 用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目標重新做乙個詮釋 這個詮釋正是動態規劃最富創造力的精華所在 從任意節點i到任意...

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

為了能講明白弗洛伊德 floyd 演算法的主要思想,我們先來看最簡單的案例。圖7 7 12的左圖是乙個簡單的3個頂點的連通網圖。我們先定義兩個二維陣列d 3 3 和p 3 3 d代表頂點與頂點的最短路徑權值和的矩陣。p代表對應頂點的最短路徑的前驅矩陣。在未分析任何頂點之前,我們將d命名為d 1 其實...

最短路徑之弗洛伊德演算法(Floyd) 動態規劃

弗洛伊德演算法 floyd 主要針對多源最短路徑,且可以解決路徑中有負權的情況 不包含負權迴路 但是迪傑斯特拉演算法只能解決正權值的單源最短路徑 可以迭代多次求多源 1.弗洛伊德演算法的基本思想 弗洛伊德演算法從圖的帶權鄰接矩陣cost出發,假設求從頂點viv vi 到vjv vj 的最短路徑 如果...