自己第一次手写堆,不知道哪里出了一点问题,1,4号点没过,求大佬帮助看一下
#include <iostream>
using namespace std;
int n, m, cnt, len, s;
const int inf = 1e9 + 1;
int hd[100005], d[100005], pos[100005], h[100005];
bool book[100005];
struct egde
{
int to;
int next;
int w;
};
egde e[200005];
inline void add (int u, int v, int w);
void dijkstra (int s);
inline int pop ();
void siftdown (int a);
void siftup (int a);
inline void swap (int a, int b);
int main ()
{
int u, v, w;
cin >> n >> m >> s;
for (int i = 1;i <= m;i++)
{
cin >> u >> v >> w;
add (u, v, w);
}
len = n;
dijkstra (s);
for (int i = 1;i <= n;i++)
cout << d[i] << ' ';
return 0;
}
void dijkstra (int s)
{
for (int i = 1;i <= n;i++)
d[i] = inf, h[i] = pos[i] = i;
d[s] = 0;
book[s] = true;
siftup (pos[s]);
int cur = s;
for (int i = 1;i < n;i++)
{
for (int i = hd[cur];i != 0;i = e[i].next)
{
if (d[e[i].to] > d[cur] + e[i].w)
{
d[e[i].to] = d[cur] + e[i].w;
if (!book[e[i].to])
siftup (pos[e[i].to]);
}
}
cur = pop ();
book[cur] = true;
}
return;
}
void siftdown (int a)
{
int l = a * 2, r = a * 2 + 1;
while (l <= len)
{
if (d[h[a]] > d[h[l]])
{
if (d[h[r]] < d[h[l]] && r <= len)
{
swap (a, r);
a = r;
}
else
{
swap (a, l);
a = l;
}
}
else if (d[h[a]] > d[h[r]] && r <= len)
{
swap (a, r);
a = r;
}
else
break;
l = a * 2, r = a * 2 + 1;
}
return;
}
void siftup (int a)
{
int f = a / 2;
while (f >= 1)
{
if (d[h[f]] > d[h[a]])
{
swap (f, a);
a = f;
f = a / 2;
}
else
break;
}
return;
}
inline int pop ()
{
int t = h[1];
swap (1, len);
len--;
siftdown (1);
return t;
}
inline void swap (int a, int b)
{
pos[h[a]] = b;
pos[h[b]] = a;
int t = h[b];
h[b] = h[a];
h[a] = t;
return;
}
inline void add (int u, int v, int w)
{
e[++cnt].next = hd[u];
e[cnt].to = v;
e[cnt].w = w;
hd[u] = cnt;
return;
}