Dijkstra Algorithm

Zhiyuan Xu Lv1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
namespace Dijkstra{
#define pp pair<int,int>
#define f first
#define s second
const int MAXN = 1e5+5;
const int MAXM = 2e5+5;
int n,m,k,dist[MAXN],head[MAXN],tot;
struct Edge{
int f,t,nxt,dis;
}edge[MAXM];
inline void add(int f,int t, int d){
edge[++tot].f = f;
edge[tot].t = t;
edge[tot].dis = d;
edge[tot].nxt = head[f];
head[f] = tot;
}
inline void dij(int source){
priority_queue<pp> q;
memset(dist,0x3f3f,sizeof(dist));
dist[source] = 0;
q.push(make_pair(0,source));
while(!q.empty()){
int qf = -q.top().f,qs = q.top().s; q.pop();
if (dist[qs]<qf) continue;
for (int i=head[qs];i;i=edge[i].nxt){
int v = edge[i].t,d = edge[i].dis;
if (dist[v]>dist[qs]+d){
dist[v] = dist[qs]+d;
q.push(make_pair(-dist[v],v));
}
}
}
}
inline int dijk(int source, int to){
priority_queue<pp> q;
memset(dist,0x3f3f,sizeof(dist));
dist[source] = 0;
q.push(make_pair(0,source));
while(!q.empty()){
int qf = -q.top().f,qs = q.top().s; q.pop();
if (dist[qs]<qf) continue;
if (qs==to) return dist[to];
for (int i=head[qs];i;i=edge[i].nxt){
int v = edge[i].t,d = edge[i].dis;
if (dist[v]>dist[qs]+d){
dist[v] = dist[qs]+d;
q.push(make_pair(-dist[v],v));
}
}
}
return 0x3f3f;
}
void init();
void solve();
}
  • Title: Dijkstra Algorithm
  • Author: Zhiyuan Xu
  • Created at : 2024-07-05 23:53:29
  • Updated at : 2024-07-05 23:54:09
  • Link: https://redefine.ohevan.com/Template/Dijkstra/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
Dijkstra Algorithm