目錄引入以及介紹
在經過我們學習了廣度優先搜尋(如果不知道的話...點這裡)之後,我們已經可以找到了從a點到達e點的一條最短路徑。只不過尋找這個路徑比較麻煩,並且浪費時間。
當然,我們經過廣度優先搜尋的路徑,只能說是乙個最短路徑,因為它經過的路的條數是最少的。就好比如下面的......
如果我們給這些道路加上了一些東西,比如什麼呢,加上了一些從開始地點到達結束地點的時間的話,那麼你就可以發現了,我們剛剛利用廣度優先搜尋所得的路徑並不是最省時間的。同時的話,你還可以發現一條更短的路徑......
在學習廣度優先搜尋的時候,我們是找出了路徑最短的那個路徑,也就是,段數最少的那個路段。而接下來我們要進行學習尋找路徑最短的路徑,而不是段數最短的那個。
------>這返回我們首先來看一下我們想要走的一幅圖:
這幅圖中,你可以把每個數字認為是走這條路徑到另乙個城市所需要的時間。然後我們要從我們的起點出發,找到一條耗時最短的路徑......
其實迪傑斯特拉演算法演算法的主要是包含了下面的四個步驟,這是《演算法**給出的》
經過解讀後,就大概是這樣的.....
對於一幅這樣的圖(借鑑《演算法導論》的圖)來說.....
我們首先從源點出發,也就是我們圖中的a點,然後從a點出發,我們尋找最小的邊,也就是我們找到了從 a->b 這一條邊了,然後我們把從a點到b點的距離更新,原本是無窮大,現在更新為5,同時a到c點更新為10.
緊接著,我們選擇小的那條邊,到了b城市。我們在b城市中選擇。從b城市可以到達c、d、e城市,那麼我們相對應的給他們附上值.....
依次這樣,之後我們把所有的點都更新完了.......
我們再來看看乙個動態的.....
**執行圖
------>這返回
接下來到了我們學習**的時候了( ̄▽ ̄)"
main.cpp
#include"dijkstra.h"
int main()/*8
0 2 8
0 3 7
0 4 1
1 0 7
2 0 1
2 1 6
2 6 2
3 1 7
3 7 9
4 2 9
5 1 8
5 7 7
6 2 8
6 4 8
6 5 3
7 5 9
-1 -1 -1
0*/
dijkstra.h#pragma once
#ifndef _dijkstra_h_
#define _dijkstra_h_
#include#include#include#includeusing namespace std;
struct node
};//可以用迭代器指標去模擬
class dijkstragraph //使用鄰接表來儲存
;#endif
dijkstra.cpp// dijkstra.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
#include "dijkstra.h"
void dijkstragraph::init()
cout << "儲存好了鄰接表" << endl;
}void dijkstragraph::dijkstra()
}for (int j = 0; j < pointnumber; j++) //找沒經歷過的最小的元素值}}
}void dijkstragraph::output()
s.push(this->start);
while (!s.empty())
cout << "\t\t 距離是:" << distance[i] << endl;
}cout << "------------------------" << endl;
}
------>這返回
參考《演算法**》、《演算法導論》、《資料結構與演算法c語言版》
Dijkstra(迪傑斯特拉)演算法
迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...
dijkstra迪傑斯特拉演算法
注意 1.標頭檔案climits的int max,加上2整數會溢位,每次相加前得判斷被加值是否為int max,int max 10為負數 2.得先初始化再對d s c s g,cost等賦值 fill d 0 d 0 max,int max fill g 0 0 g 0 0 max max,int...
迪傑斯特拉 Dijkstra 演算法
迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。通過dijkstra計算圖g中的最短路徑時,需要指定起點s 即從頂點s開始計算 dijkstra演算法算是貪心思想實...