Dijkstra依旧基于贪心
用堆排序动态维护剩余点中dist[] 最小的点
堆排序优化Dijkstra算法 稀疏图,用邻接表,稠密也可以
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dijkstra()
{
memset(dis,0x3f,sizeof dis);
dis[1]=0;
//定义生成小根堆
priority_queue<PII ,vector<PII>, greater<PII>> heap;
heap.push({0,1}); //距离,编号
while(heap.size())
{
auto t=heap.top();//最小堆直接得到dist最小的节点
heap.pop();
int ver=t.second,distance=t.first;
if(st[ver]) continue;
st[ver] = true;
for(int i=h[ver];i!=-1;i=ne[i])
{
int j=e[i];
if(dis[j]>distance+w[i])
{
dis[j]=distance+w[i];
heap.push({dis[j],j});
}
}
}
}