最短路 Dijkstra 堆優化 鏈式前向星

2021-10-12 08:04:30 字數 1373 閱讀 9531

題目鏈結

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?

輸入包括多組資料。每組資料第一行是兩個整數n、m(n<=100,m<=10000),n表示成都的大街上有幾個路口,標號為1的路口是商店所在地,標號為n的路口是賽場所在地,m則表示在成都有幾條路。n=m=0表示輸入結束。接下來m行,每行包括3個整數a,b,c(1<=a,b<=n,1<=c<=1000),表示在路口a與路口b之間有一條路,我們的工作人員需要c分鐘的時間走過這條路。

輸入保證至少存在1條商店到賽場的路線。

對於每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間

2 11 2 3

3 31 2 5

2 3 5

3 1 2

0 03

2

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1e4+5;

int head[maxn]

;int cnt=0;

struct edgee[maxn*4]

;struct node

node

(int dis,

int id)

:dis

(dis),id

(id)

//方便插入新節點

bool

operator

<

(const node& a)

const

//過載< 用於在優先佇列中排序};

int dis[maxn]

,vis[maxn]

;priority_queue q;

//優先佇列

void

add(

int u,

int v,

int w)

//實際上可以理解為頭插法的鄰接表

void

dij(

int x)}}

}int

main()

dij(1)

;if(dis[n]

==0x3f3f3f3f

)//如果dis[n]的值沒有被改變就是無法到達

cout<

<-1

<

else

cout<

<

}return0;

}

模版 堆優化Dijkstra求最短路

一 堆優化的主要思想就是使用乙個優先佇列 就是每次彈出的元素一定是整個佇列中最小的元素 來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。幾個細節 優先佇列的資料型別 優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得...

Dijkstra求最短路(樸素and堆優化)

題目來自acwing 題目描述 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,所有邊權均為正值。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出 1。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸出格式...

最短路之dijkstra及其堆優化

dijkstra演算法用來解決單源最短路徑問題 通常來說就是求解乙個圖中兩節點的最短路徑 只適用於正權邊 該演算法的樸素想法是鬆弛的思想 即若dis 1 3 7 dis 1 2 1 dis 2 3 1 則節點2的存在就可以對1,3鬆弛 在鬆弛完乙個節點之後要選擇尚未進行鬆弛的節點鬆弛,且要選擇距起點...