模板 單源最短路徑(Dijkstra演算法)

2021-10-24 08:30:36 字數 1121 閱讀 4942

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

鏈式前向星(存邊結構):與鍊錶的結構和查詢遍歷方式相同,唯一的不同點就是插入的位置。鏈式前向星每次將新的元素插入煉表頭。為每乙個節點建立乙個鍊錶,存入此節點的所有出邊。

dijkstra演算法:這個演算法要求所有邊的權重都為非負值。定義d[i]為從起點到第i個節點的最短路徑長度。

演算法流程:假設起點為s。1.令d[s]=0 ,其它d[i]為無窮大 2.從沒有被標記的節點中找出d[x]最小的節點x,然後標記x 3.列舉x的所有出邊x->y(邊權為w) ,若d[y]>d[x]+w,則用d[x]+w更新d[y] 4.重複2、3,直到所有節點都被標記。

演算法原理:基於貪心思想。每次找到的d[x]最小的節點,不可能再被較大的d[y]更新,所以d[x]必然是s~x的最短路徑。

演算法優化:動態維護d[x]最小值,減少查詢的時間。利用stl 優先佇列(大根堆),用stl pair存d[x]和x,將d[x]轉成-d[x]存入,把大根堆轉化成小根堆。

#include using namespace std;

typedef long long ll;

const int inf=0x7fffffff;

const int maxn=1e5+5;

const int maxm=2e5+5;

int n,m,s,c;

bool v[maxn]; //v表示是否標記

int head[maxn],d[maxn]; //head[x]表示節點x的煉表頭

struct edgee[maxm];

inline void add(int from,int to,int w) //加邊

priority_queue> q;

inline void dijkstra()

} }}int main()

dijkstra();

for(int i=1;i<=n;i++) printf("%d ",d[i]);

return 0;

}

模板 單源最短路徑

如題,給出乙個有向圖,請輸出從某一點出發到所有點的最短路徑長度。輸入格式 第一行包含三個整數n m s,分別表示點的個數 有向邊的個數 出發點的編號。接下來m行每行包含三個整數fi gi wi,分別表示第i條有向邊的出發點 目標點和長度。輸出格式 一行,包含n個用空格分隔的整數,其中第i個整數表示從...

單源最短路徑 模板 dijkstra

p4779 模板 單源最短路徑 標準版 原題鏈結 鏈式前向星 題目描述 給定乙個 n個點,m條有向邊的帶非負權圖,請你計算從 s 出發,到每個點的距離。資料保證你能從 s 出發到任意點。輸入格式 第一行為三個正整數 n,m,s。第二行起 m 行,每行三個非負整數 ui,vi,wi表示從ui到 vi ...

單源最短路徑

include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...