dijkstra演算法:
是解決單源最短路徑問題的貪心演算法,它先求出長度最短路徑的一條路徑,再參照該最短路勁求出長度次短的一條路徑直到求出從源點
到其他各個頂點的最短路徑。
dijkstra演算法得基本思想是首先假定源點為u,頂點集合v被劃分為兩部分:集合s和v-s。初始時s中僅含有源點u,其中s中的頂點到源點的最短路徑已經確定。集合v-s中所含有的頂點到源點的最短路徑的長度待定,並且用陣列dist記錄當前每個頂點所對應的最短特殊路徑長度。
dijkstra演算法採用的貪心策略是選擇特殊路徑長度最短路徑,將其連線到v-s中的頂點並將該節點加入到dist陣列當中,一旦dist陣列中包含了所有頂點dist就是從源點到所有其他頂點之間的最短路徑。
資料結構:
(1)設定地圖的帶權鄰接矩陣map,即如果從源點u到頂點i有邊,就令map等於源點到各個結點的權值
(2)初始化。令集合s=,對於集合v-s中頂點x,初始化dist [i] =map [u] [ i ]
(3)找最小。在集合v-s中依照貪心策略來尋找使得dist[j]具有最小值的頂點t,
(4)加入集合s中
(5)判結束。如果集合v-s為空,演算法結束,否則轉6
(6)在(3)中判斷找那個已經找到了源點到t的最短路徑,那麼對集合v-s中所有與頂點t相鄰的頂點j,都可以借助t走捷徑。如果dist[j]>dist[t]+map[t][j],則dis[j]=dis[t]+map[t][j]記錄頂點j的前驅為t,有p[i]=t;用於儲存path(路徑)。
#include
#include
#include
#define inf 1000
using namespace std;
const
int maxn=
1000+5
;int dist[maxn]
;//用於儲存源點到各個結點的距離
int map[maxn]
[maxn]
;//用於儲存各個結點之間的距離
int n,m,k;
//輸入
int s[maxn]
;//用於儲存結點集合
int p[maxn]
;//用於儲存前驅
void
dijkstra
(int u)
//預處理
dist[u]=0
; s[u]=1
;//將源結點標記為已訪問
for(
int i=
1;i<=n;i++)}
//找與源結點距離最近的乙個結點
if(t==u)
return
; s[t]=1
;//標記為已訪問
for(
int k=
1;k<=n;k++)}
//將該最小結點來判斷是否可以讓剩下的結點的值更小}}
intmain()
cin>>k;
dijkstra
(k);
stack<
int>s;
for(
int i=
1;i<=n;i++
)while
(!s.
empty()
) cout<" "<<}}
**優化:
才用優先佇列的方式:因為每次選擇乙個新的結點以後我們就需要更新以下的結點,進行重新排序,所以我們
不妨把每次訪問後的結點直接pop出去,再利用queue佇列的排序的功能再從佇列的頂部取得乙個元素,檢視之後結點是否可以
繼續更新,省去的每次迴圈都要找最小的步驟。
#include
#include
#include
#include
#include
using namespace std;
const
int maxn=
1000
;int flag[maxn]
;const
int inf=
1e7;
int map[maxn]
[maxn]
;int dist[maxn]
;int n,m;
struct node
;node
(int a,
int b)
operator <
(const node &a)
const};
void
dijkstra
(int st)}}
//for
}//while
}int
main()
cin>>k;
dijkstra
(k);
for(
int i=
1;i<=n;i++)}
//main
一場說走就走的旅行
2015年1月7日下午四點 沒有任何徵兆,沒有任何準備,一句話便開啟了我們的江浙之旅 上有天堂,下有蘇杭 江南一直是我的夢中之地,尤其是杭州 出行第一站便來到了杭州 清早一下火車便直奔西湖 孤山腳下 迎著西湖看著日出 夾雜著初到杭州的興奮 忘卻了寒冷 站在省博三樓 從窗戶眺望西湖 連日來的忙碌 隱藏...
趣學演算法 一場說走就走的旅行 (最短路)
有一天,孩子回來對我說 媽媽,聽說馬爾地夫很不錯,放假了我想去玩。馬爾地夫?我也想去!沒有人不嚮往一場說走就走的旅行!其實我想去的地方很多,呼倫貝爾大草原 玉龍雪山 布達拉宮 艾菲爾鐵塔 小孩子還說著他感興趣的地方。於是我們拿出地圖,標出想去的地點,然後計算最短路線,估算大約所需的時間,有了這張秘製...
來一場說走就走的wifi旅行
又到了一年畢業季了,也迎來了旅遊的旺季。九寨溝 廈門 麗江哪乙個是你嚮往的,哪乙個是你說走就走的地方呢!當然說走就走的旅行肯定少不了wifi。旅行肯定不是一天倆天就行的,最少也得乙個星期。所以該準備的物品都得準備好,衣服 藥品 防曬霜等都是可以解決的。但是旅途中沒有wifi怎麼辦!乙個多星期沒有 w...