前言
具體問題
Dijkstra算法
int[] dis = {0,0,1,12,999999,999999,999999};
明明是一共6個點,我們這裏爲什麼是七個數據呢?那是爲了便於編碼,我們默認dis[0]是沒有意義的,所以編碼時,從dis[1]開始,dis[1] = 0,表示1到它自己是0,dis[2] = 1,表示1到2的距離是1。 int[] dis = {0,1,12,999999,999999,999999};//省掉了第0個數
還記得上面的999999表示的是什麼嗎?表示的是暫時這兩點不連通喲,和上篇文章一樣的意思。 int[] dis = {0,1,10,4,999999,999999};
int[] dis = {0,1,10,4,999999,999999};
然後我們需要繼續借道4來縮短1到其他點的距離 int[] dis = {0,1,8,4,17,19};
int[] dis = {0,1,8,4,17,19};
int[] dis = {0,1,8,4,13,19};
int[] dis = {0,1,8,4,13,17};
3、在集合Q中,選擇一個距離源點最近的點,加入到集合P中,然後考察集合Q中的剩餘點,能否藉助已知最短路徑的點,來縮短到源點的距離。
4、重複第3步,直到集合Q中的元素爲0個,算法結束,最終dis數組中的值,就是源點到各個點的最短路徑。
分析完成之後,我們就可以進行代碼編寫了。
Dijkstra算法代碼如下
public void dijkstra(int[][] paths,int n){
int[] dis = new int[n + 1];
//初始化dis數組
for (int i = 1; i <= n; i++) {
dis[i] = paths[1][i];
}
//初始化mark數組
int[] mark = new int[n +1];
for (int i = 1; i <= n; i++) {
mark[i] = 0;
}
mark[1] = 1;
while (!isEnd(mark)){
//先比較所以mark = 0 的值,將最小的那個變成確定值,並且根據這個值來更新dis數組
int min = 999999;
int minNum = 1;
for (int i = 1; i <= n; i++) {
if (mark[i] == 0 && dis[i] < min){
min = dis[i];
minNum = i;
}
}
//將這個值變成確定值
mark[minNum] = 1;
//並且根據這個確定值來縮小其他dis數組中的值
for (int i = 1; i <= n; i++) {
if (dis[i] > dis[minNum] + paths[minNum][i]){
dis[i] = dis[minNum] + paths[minNum][i];
}
}
}
StringBuilder bu = new StringBuilder();
for (int i = 1; i <= n; i++) {
bu.append(" "+dis[i]);
}
Log.i("hero","---dis == "+bu.toString());
}
private boolean isEnd(int[] mark){
for (int i = 1; i < mark.length; i++) {
if (mark[i] == 0){
return false;
}
}
return true;
}
isEnd方法,是用來判斷估算值集合是否還有數,以便於結束算法的方法.。 public void shortestPath(){
//初始化城市地圖
int[][] paths = new int[7][7];//便於理解,多初始化了一個數
paths[1][1] = 0; paths[1][2] = 1;paths[1][3] = 12;paths[1][4] = 999999;paths[1][5] = 999999;paths[1][6] = 999999;
paths[2][1] = 999999;paths[2][2] = 0;paths[2][3] = 9;paths[2][4] = 3;paths[2][5] = 999999;paths[2][6] = 999999;
paths[3][1] = 999999; paths[3][2] = 999999; paths[3][3] = 0;paths[3][4] = 999999;paths[3][5] = 5;paths[3][6] = 999999;
paths[4][1] = 999999; paths[4][2] = 999999; paths[4][3] = 4;paths[4][4] = 0;paths[4][5] = 13;paths[4][6] = 15;
paths[5][1] = 999999; paths[5][2] = 999999; paths[5][3] = 999999;paths[5][4] = 999999;paths[5][5] = 0;paths[5][6] = 4;
paths[6][1] = 999999; paths[6][2] = 999999; paths[6][3] = 999999;paths[6][4] = 999999;paths[6][5] = 999999;paths[6][6] = 0;
dijkstra(paths,6);
}