今天在做一道题中涉及两次不同dist数组的dijkstra算法,遇到了一个比较难发现的问题。因此我选择将dist数组作为形参传递进去进行初始化计算,但这导致结果不正确,debug了好久也不知道哪里错了最后发现问题出在memset和数组的函数传递上
在C++中,对于数组作为函数参数传递时,sizeof dist将返回指针的大小,而不是数组的大小。
指针大小在64位机上是64位即8个Byte
因此这里只初始化了数组的前2个元素,并不是所有元素
void dijkstra(int start, int dist[])
{
//memset(dist, 0x3f, sizeof dist);
//问题出在这里,不能在函数内对传过来的数组指针进行初始化,会导致错误
//只初始化数组指针大小的空间
//正确的初始化应该是
memset(dist, 0x3f, 4 * N);
memset(st, 0, sizeof st);
dist[start] = 0;
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({0, start});
}