[模板] dijkstra (堆优化)
Posted railgun000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[模板] dijkstra (堆优化)相关的知识,希望对你有一定的参考价值。
复杂度O(mlogn)
输入起点s,可以得到从起点到各点的最短路距离数组dis[i]
过程:
1.初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点
2.搜索:取出队首并pop,如果队首节点u的当前最短路比u的原先的最短路大则跳过,否则遍历u的邻接点如果v没有被访问过且u的最短路加上当前邻接边边权小于原先v的最短路,则更新v的最短路且搜索v
1 void dijkstra(int s) 2 memset(vis,0,sizeof vis); 3 memset(dis,inf,sizeof dis); 4 dis[s]=0; 5 priority_queue<node> q; 6 node a(s,dis[s]); 7 q.push(a); 8 while(q.size()) 9 node x=q.top();q.pop(); 10 int u=x.pos; 11 if(x.val>dis[u])continue; 12 for(int i=head[u];~i;i=e[i].nex) 13 int v=e[i].to; 14 if(!vis[v]&&(dis[v]>e[i].w+dis[u])) 15 dis[v]=e[i].w+dis[u]; 16 a.pos=v,a.val=dis[v]; 17 q.push(a); 18 19 20 21 22 /** 23 初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点 24 搜索:取出队首并pop,如果队首节点u的当前最短路比u的原先的最短路大则跳过,否则遍历u的邻接点v, 25 如果v没有被访问过且u的最短路加上当前邻接边边权小于原先v的最短路,则更新v的最短路且搜索v 26 **/
以上是关于[模板] dijkstra (堆优化)的主要内容,如果未能解决你的问题,请参考以下文章
hdu 2544 单源最短路问题 dijkstra+堆优化模板
P4779 模板单源最短路径(标准版)二叉堆优化的 Dijkstra