由於 Dijkstra 的演算法只能求出某一點到其他頂點的最短距離, 如果要求出圖形中任兩點甚至所有頂點間最短距離, 就必須使用 Floyd 演算法. 該演算法定義可以參考 這裡.
頂點兩兩之間的最短距離 (使用 Floyd 演算法) :
光看 Floyd 演算法相當複雜難懂, 下面將直接以實例說明它的演算法則, 請求出下圖各頂點間的最短路徑 :
範例代碼 :
範例代碼將求下列圖形的頂點間, 兩兩的最短路徑 :
- #include
- using namespace std;
- #define SIZE 7
- #define NUMBER 6
- #define INFINITE 9999 // 無窮大
- int Graph_Matrix[SIZE][SIZE]; // 圖形陣列
- int distances[SIZE]; // 路徑長度
- int distanceMx[SIZE][SIZE] = {INFINITE}; // 路徑長度陣列
- void _BuildGraph_Matrix(int *Path_Cost) {
- int start_Point; // 邊線的起點
- int end_Point; // 邊線的終點
- for(int i=1; i
- for(int j=1; j
- if(i==j)
- Graph_Matrix[i][j] = 0; // 對角線為0
- else
- Graph_Matrix[i][j] = INFINITE;
- // 存入圖形的邊線
- int i=0;
- while(i < SIZE) {
- start_Point = Path_Cost[i*3];
- end_Point = Path_Cost[i*3+1];
- Graph_Matrix[start_Point][end_Point] = Path_Cost[i*3+2];
- i++;
- }
- }
- void _PrintGraph_Matrix(){
- for(int i=1; i< SIZE; i++) {
- cout << "Vertx" << i;
- for(int j=1; j
- if(Graph_Matrix[i][j] == INFINITE)
- printf(" x");
- else
- printf("%5d", Graph_Matrix[i][j]);
- }
- cout << endl;
- }
- }
- void _floydShortestPath(int vertex_total) {
- // 圖形長度初始化 (A0 的矩陣)
- for(int i=1; i<=vertex_total; i++) {
- for(int j=i; j<=vertex_total; j++) {
- distanceMx[i][j] = Graph_Matrix[i][j];
- distanceMx[j][i] = Graph_Matrix[i][j];
- }
- }
- /*John Debug*/
- //for(int i=1; i<=vertex_total; i++) {
- // for(int j=1; j<=vertex_total; j++) {
- // printf("%5d ",distanceMx[i][j]);
- // }
- // printf("\n");
- //}
- // 利用 Floyd 演算法找出所有頂點兩兩間的最短距離
- for(int k=1; k<=vertex_total; k++) // 求出 AK 的矩陣
- for(int i=1; i<=vertex_total; i++)
- for(int j=1; j<=vertex_total; j++)
- if(distanceMx[i][j] > ( distanceMx[i][k] + distanceMx[k][j]))
- distanceMx[i][j] = distanceMx[i][k] + distanceMx[k][j];
- }
- void main(bool b) {
- int Path_Cost[7][3] = {{1,2,10},
- {2,3,20},
- {2,4,25},
- {3,5,18},
- {4,5,22},
- {4,6,95},
- {5,6,77}};
- _BuildGraph_Matrix(&Path_Cost[0][0]);
- cout << "==========================" << endl;
- cout << "此範例圖形相鄰矩陣如下 :" << endl;
- cout << "==========================" << endl;
- cout << "頂點 vex1 vex2 vex3 vex4 vex5 vex6" << endl;
- _PrintGraph_Matrix();
- cout << "==========================" << endl;
- _floydShortestPath(NUMBER);
- cout << "所有頂點兩兩間最短距離為: " << endl;
- cout << "==========================" << endl;
- cout << "頂點 vex1 vex2 vex3 vex4 vex5 vex6" << endl;
- for(int i=1; i
- cout << "Vertx" << i;
- for(int j=1; j
- printf("%5d", distanceMx[i][j]);
- }
- cout << endl;
- }
- }
補充說明 :
* [ 資料結構 小學堂 ] 圖形結構 : 圖形最短路徑 (單點對全部頂點)
沒有留言:
張貼留言