Dijastra最優路徑演算法

2021-07-03 16:55:07 字數 2877 閱讀 3319

關於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作為乙個等待檢查的方...