一場說走就走的旅行 最短路徑

2021-09-13 18:46:04 字數 2431 閱讀 1987

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...