最短路-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基本思路 找到最短距離已經確定的頂點,從它出發...