模版 堆優化Dijkstra求最短路

2021-10-01 01:53:28 字數 1451 閱讀 6760

一:堆優化的主要思想就是使用乙個優先佇列(就是每次彈出的元素一定是整個佇列中最小的元素)來代替最近距離的查詢,用鄰接表代替鄰接矩陣,這樣可以大幅度節約時間開銷。

幾個細節:

優先佇列的資料型別

優先佇列應該用於快速尋找距離最近的點。由於優先佇列只是將最小的那個元素排在前面,因此應該定義一種資料型別,使得它包含該節點的編號以及該節點當前與起點的距離。

在什麼時候對佇列進行操作

佇列操作的地方,首先就是搜尋剛開始,要為起點賦初始值,此時必須將起點加入優先佇列中。該佇列元素的節點編號為起點的編號,該節點當前與起點的距離為0。

模版參考

測試題目

p4779 【模板】單源最短路徑(標準版)

//---------使用模版前言---------

//注意頂點數maxn的值 注意極大資料inf的值

#include

#include

#include

#include

#include

#include

#include

#define maxn 300010

//最大頂點數 注意依題修改大小

#define inf 0x3f3f3f3f

//極大資料 10^9數量級

using namespace std;

typedef pair<

int,

int> info;

//存放當前點及從源點到當前點的最短路徑的資訊

priority_queue

, greater

> q;

//優先佇列實現將已確定最短路徑的點放入佇列 小頂堆實現堆優化

struct edge

//弧的初始化};

vector g[maxn]

;//存放當前點出發的每一條弧的資訊

int n, m, s;

//點 弧 源點

int dis[maxn]

;//從源點到當前點的最短路徑(迪傑斯特拉跑完之前不一定是最終解)

int vis[maxn]

;//該陣列用於標記當前點是否已訪問過 起到優化作用

void

dijkstra

(int s)}}

}int

main()

dijkstra

(s);

//演算法實施

for(

int i =

1; i < n; i++

)printf

("%d "

, dis[i]);

printf

("%d\n"

, dis[n]);

//規範輸出無多餘空格

//輸出從源點到其他所有點的最短路徑

return0;

}

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

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

Dijkstra求最短路(堆優化版)

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

dijkstra和dijkstra堆優化模板

之前qaq一直沒有準備堆優化模板,本例以pat a1003為例,整理dijkstra和dijkstra堆優化模板 我們可以發現該篇幅找最小值部分是使用量乙個for迴圈 include include using namespace std int n,m,c1,c2 int edge 510 510...