最短路 Dijkstra演算法模板

2021-10-12 17:48:02 字數 1556 閱讀 3542

最短路-dijkstra演算法

不能處理負權邊

未優化:時間複雜度為o(n^2) ,n為頂點數

堆優化:時間複雜度大概為o((m+n)logm),m為邊數

模板題(未優化):p3371 【模板】單源最短路徑(弱化版)

模板題(堆優化):p4779 【模板】單源最短路徑(標準版)

code 未優化:

#include

#include

using

namespace std;

struct node

;const

int inf=

0x7fffffff

;const

int max_n=

1e4+5;

int n,m;

vector e[max_n]

;int dist[max_n]

;bool tag[max_n]

;void

dijkstra

(int s)

tag[u]

=true

;for

(auto c:e[u])if

(tag[c.v]

==false

&&dist[c.v]

>dist[u]

+c.w)}}

intmain()

);}dijkstra

(s);

for(

int i=

1;i++i)

printf

("%d "

,dist[i]);

printf

("%d\n"

,dist[n]);

return0;

}

code 堆優化:

#include

#include

#include

using

namespace std;

typedef pair<

int,

int> pr;

const

int max_n=

1e5+5;

const

int inf=

1e9+5;

int n,m;

vector e[max_n]

;int dist[max_n]

;bool tag[max_n]

;priority_queue

,greater> q;

void

dijkstra

(int s));

int u,v,w;

while

(!q.

empty()

));}

}}}int

main()

);}dijkstra

(s);

for(

int i=

1;i++i)

cout<<<

" ";

cout<

}

最短路 Dijkstra模板

普通dijkstra,複雜度o n n include using namespace std int n,m,f 105 105 dis 105 bool b 105 n為總共的點數,m為路徑數,f陣列記錄兩個點的距離,dis陣列記錄每個點到原點的距離 int main memset dis,1,...

Dijkstra求最短路(最短模板)

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

最短路 Dijkstra演算法

dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...