rt,之前看到有人提问过,但是并没有理解,百度了很久大部分也都只给了结论而没有证明,只能来请教一下各位大佬麻烦帮忙解答一下疑惑。
目前综合百度,书本和同学讨论大概的理解是:在堆优化下找到每个最小的点的时间复杂度是 O(n logn),边一共被遍历 m 次。在最优情况下时间复杂度为 O(n logn + m)。考虑到进行松弛操作的时候都会往堆里重复加入元素,在最劣情况下(每次遍历边都进行松弛),堆里会有 n + m 个元素,时间复杂度为O((n + m)logn),不知道这样理解对不对。感觉把最劣情况作为时间复杂度有点奇怪,所以觉得是我的理解出错了QAQ
//堆优化Dijkstra参考代码
q.push(make_pair(0,s));
dis[s] = 0;
while(!q.empty())
{
int x = q.top().second;
q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(int i = head[x]; i; i = Next[i])
{
int y = ver[i], w = edge[i];
if(dis[x] + w < dis[y])
{
dis[y] = dis[x] + w;
q.push(make_pair(dis[y], y));
}
}
}