求助!手写堆为什么第一,四点没过
查看原帖
求助!手写堆为什么第一,四点没过
314326
ZXX666楼主2021/7/19 11:42

自己第一次手写堆,不知道哪里出了一点问题,1,4号点没过,求大佬帮助看一下

  • pos[i]为i在堆中的距离位置
  • h为堆数组
  • d[i]为源点到i的最短距离
#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;
}
2021/7/19 11:42
加载中...