在這篇部落格中我主要講解最短路徑演算法中的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 的最短路徑 如果...