關於dijastra演算法,零零散散地研究了差不多兩天了,基本上弄懂了它的思路和寫程式的思路。演算法思路不是很難(沒理解時還是覺得有點晦澀),**的實現過程,需要反覆推敲和琢磨。目前先寫個初級版本(現在暫時只理解到這個程度)
演算法的思想和方法,各路牛人已經寫過很多,小菜鳥就不贅述了,對我自己而言,我覺得下面的思路有助於我的理解,寫上來:
首先上乙個無向圖,以及對應的dijastra演算法過程(**我在理解時,也參考了這篇文章)
大致思路,首先選取源結點a,將除源節點以外的其他結點分到u集合中,然後從a開始,遍歷與它直接相鄰的結點,選取路徑ac最短,故c結點做為下一次的起始點。上面的表,對於這個過程描述得很清楚。看完這個,演算法的思想大致就理解了。但是對於**,還是有一定距離的。下面是我手寫的,對於這個演算法,**大致的思路
完整**c++實現:
#include#include#include #include #include #include #includeusing namespace std;
const int max_required = 505;//城市數量最大值
const int max_int = 0x7fffffff;//城市間沒有路徑時,將距離設定為乙個很大的數
int map[max_required][max_required];//用陣列存放城市地圖
int callnum[max_required];//該陣列存放每個城市對應救援團隊的數量
struct city
city[max_required];//新建陣列,存放型別為city
void dijkstra(int start, int end,int n)
; int map[6][6] = ,
, ,
, ,
};*///測試使用**,可以忽略
for (int i = 0; i < n; i++)//初始化所有的項
city[start].dist = 0;//初始化源點到自己的距離為0
city[start].number = 1;//如果不是做pat題,該變數不需要
city[start].call = callnum[start];//如果不是做pat題,該變數不需要
//求最短路徑及其位置
for (int cnt = 0; cnt < n; cnt++)//控制總共迴圈的次數
}if (pos == -1)
break;
city[pos].visited = 1;
//根據下乙個結點在矩陣中對應的值,調整結點到原點距離的最小值和對應的救援團隊數量
for (int j = 0; j < n; j++)
/*else if (city[j].dist==(city[pos].dist + map[pos][j]))//這種情況是為了處理最短路徑有多條時的情況*/}
} }cout << "結點" << start << "到結點" << end << "的最短距離為" << city[end].dist;
vectorfinal_path;
final_path.push_back(end);//通過前驅結點,將end到start的最短路徑找出來,放在容器中
int temp = city[end].prev;
while (temp != start)
final_path.push_back(start);
cout << "路徑為";
for (int i = final_path.size() - 1; i >= 0; i--)
else
}cout << city[end].dist << " " << city[end].call;//這個是為了配合pat1003那道題的,單純的dijkstra演算法求最短路徑及相應的值已經搞定
}int main()
} for (i = 0; i> a >> b >> l;
map[a][b] = l;
map[b][a] = l;
} //輸入樣例
/*5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1*/
//除錯使用,可以不適用輸入樣例,直接用這部分除錯**。注意將int callnum[6]以後的**寫在dijkstra函式中
//int n = 6, m = 9;
//int start = 0, end = 4;
//cin >> start >> end;
//int callnum[6] = ;
//int map[6][6] = ,
// ,
// ,
// ,
// ,
// //};//發現這部分**如果寫在主函式裡,到呼叫dijkstra時,map中元素全部為0,還沒太弄明白
dijkstra(start, end, n);
return 0;
}
Dijkstra最優路徑的演算法
dijkstra最優路徑的演算法 最短路徑演算法 在日常生活中,我們如果需要常常往返a地區和b地區之間,我們最希望知道的可能是從a地區到b地區間的眾多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包...
Dijkstra演算法 尋找最優路徑
一般情況下,dijkstra演算法是解決單源最短路徑問題的,也就是在已知終點時,求出圖中的每個點到終點的最短距離,但是一般只記錄距離值,不會記錄具體的路徑,即怎麼走能從起點通過最短路徑來到達終點 思路就是引入乙個path表,其中path x 表示,如果從x節點要到達終點的最短路徑,在x節點下一步應該...
A (最優路徑)
尋路 尋找最短路徑並避開障礙物 首先將地圖虛擬化,將地圖劃分為乙個乙個的小方塊,這樣可以用二維陣列來表示地圖。如下所示,綠色塊 a 是起點,紅色塊 b 是終點,中間藍色塊是障礙物,白色塊是空地。先羅列出所有的步驟,等會按照例子一步一步分析 1 尋路步驟 步驟1.從起點a開始,把a作為乙個等待檢查的方...