码迷,mamicode.com
首页 > 其他好文 > 详细

[模板] dijkstra (堆优化)

时间:2019-08-25 13:51:44      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:tin   eof   优先队列   输入   pos   col   模板   复杂   优化   

复杂度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 (堆优化)

标签:tin   eof   优先队列   输入   pos   col   模板   复杂   优化   

原文地址:https://www.cnblogs.com/Railgun000/p/11407457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!