佛洛依德演算法:
利用d矩陣拿到鄰接矩陣中的權值。path矩陣記錄兩點之間的移動中轉點(初始值為起點)。
對於鄰接矩陣中 i 到 j 點的權值進行比較,若加上乙個中轉點 k 後的權值小於原本的權值,則對d[i][j]改為較小的d[i][k] + d[k]+[j]
而更新之後,路徑則是從i–j改為i–k--j,所以path[i][j] = path[k][j];
若要輸出 i到 j的路徑,要迴圈輸出path對應位置的值.
注意,當路徑變長時,path矩陣儲存的值需要倒序輸出才行,
舉個例子:
有五個點abcde ,對應座標分別為01234
其中頂點的連線關係為 a-b b-c c-d d-e a-e
由於三重迴圈先後順序的緣故,path[0][4]的中轉點為3
所以當頂點數量多時,個人認為需要倒序輸出path中記錄的路徑資訊
演算法**:
//圖中任意結點間最短路徑的演算法(佛洛依德演算法)
void
floyd
(graph g)
else path[i]
[j]=-1
;//否則記為-1
}for
(int k =
0; k
)for
(int i =
0;i
)for
(int j =
0; j < g.vexnum; j++)}
//此時已經算出了所有點之間的最短路徑,path記錄了點之間的路徑
}
應用在實際問題上:請為珠江三角洲城市間設計與實現乙個簡單的交通諮詢系統。
基本要求:
(1)設計簡單的珠江三角洲城市間道路通行平面圖 ,所含城市不少於10個。以圖中頂點表示城市節點,存放城市名稱、代號、簡介等資訊;以邊表示通行道路,存放道路的路徑長度。
(2)提供圖中任意城市的相關資訊查詢。
(3)提供圖中任意城市間的最短路徑查詢。
#include #include #define vexnum 10
#define maxuse 32767
using namespace std;
//圖的鄰接矩陣儲存結構
typedef struct graph graph;
/*找到a頂點在g中的位置*/
int locatevex(graph g, string a)
return -1;
}//建立圖的資訊
int createjz(graph &g)
//初始化鄰接矩陣
for (int i = 0; i < g.vexnum; i++)
} //輸入邊的資訊
cout << "分別輸入兩點及其之間邊的資訊:" << endl;
for (int k = 0; k < g.arcnum; k++)
g.arcs[i][j] = use;
g.arcs[j][i] = g.arcs[i][j];
} return 1;
}//查詢兩點距離資訊
int distance(graph g, string a, string b)
return g.arcs[i][j];
}//查詢於該地點可連線的地點及其距離
void check(graph g, string a)
}//此時已經算出了所有點之間的最短路徑
//匹配a,b在圖中的節點的位置
int a_index = locatevex(g, a);
int b_index = locatevex(g, b);
if(d[a_index][b_index] != maxuse)
cout << a << "到" << b << "的最短路徑長度為" << d[a_index][b_index] << endl;
else cout << "無最短路徑" << endl;
//迴圈輸出path中所經路徑的節點
int index = b_index;
int i = 0;
cout << "所經城市為" << a << "--";
while (a_index != path[a_index][index])
//倒序輸出地點
for (i--; i >= 0; i--)
cout << b << endl;
}int main()
}}
求最短路徑
從源點到終點的路徑可能存在三種情況 1.沒有路徑 2.只有一條路徑 3.有多條路徑 思路 按照路徑長度遞增的次序從源點到終點的路徑。假設gra ph graph graph 為有向網的鄰接矩陣,s ss為已找到最短路徑結點的集合,其初始狀態為只含乙個頂點,即源點。另設乙個一維陣列dis t n di...
Dijkstra演算法求最短路徑
參考文獻 dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用open,close表方式,drew為了和下面要介紹的 a 演算法和 d 演算法表述一致,這裡均採用open,close表的方式。大概過程 建立兩個表,open,close。open表儲存所有已生成而未考察的節點,...
Dijkstra演算法求最短路徑
dijkstra演算法用來求最短距離 已經實現了 那麼最短路徑 如何求解並列印出來呢?此處的方法是記錄路徑中結點的前驅 if v未被訪問 以u為中介點可以使起點s到頂點v的最短距離d v 更優 程式具體實現,鄰接矩陣版 n為頂點數,maxv為最大頂點數 int n,g maxv maxv 起點到達各...