堆优化版的dijkstra
作者:
丶123
,
2021-10-03 16:36:33
,
所有人可见
,
阅读 233
有点类似于广度优先搜索,每次更新完距离之后,将他们push进小根堆中,然后堆顶元素就是未访问的点中距离最小的点
void dijkstra()
{
fill(d,d+N,INF);
d[1] = 0;
priority_queue<PII,vector<PII>,greater<PII>> heap; //小根堆
heap.push({0,1});
while(heap.size())
{
auto t = heap.top();
heap.pop();
int u = t.second;
if(vis[u] == true) continue; //重边,且重边较长(小根堆特性)
vis[u] = true;
for(int i=0;i<G[u].size();i++)
{
int v = G[u][i].v;
int distance = G[u][i].w;
if(vis[v) == false && d[u] + distance < d[v]) //以u为中介点更新未访问点的距离
{
d[v] = d[u] + distance;
heap.push({d[v],v}); //将更新后的距离加入小根堆
}
}
}
}