[模板] dijkstra (堆优化)

复杂度O(mlogn)
输入起点s,可以得到从起点到各点的最短路距离数组dis[i]

过程:

1.初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点
2.搜索:取出队首并pop,如果队首节点u的当前最短路比u的原先的最短路大则跳过,否则遍历u的邻接点如果v没有被访问过且u的最短路加上当前邻接边边权小于原先v的最短路,则更新v的最短路且搜索v

3.注意:在bool operator(const node &a)const{return a.w<w;}中是要a.w<w才能让优先队列中w小的优先,如果是a.w>w则是w大的优先

 1 struct node{
 2     int pos;
 3     ll w;
 4     node(int pp,ll ww){pos=pp;w=ww;}
 5     bool operator<(const node &a)const{return a.w<w;}   ///调了一个下午,原来是要a.w<w才能让优先队列中w小的优先,如果是a.w>w则是w大的优先
 6 };
 7 void dijkstra(int s){
 8     memset(vis,0,sizeof vis);
 9     memset(dis,inf,sizeof dis);
10     dis[s]=0;
11     priority_queue<node> q;
12     node a(s,dis[s]);
13     q.push(a);
14     while(q.size()){
15         node x=q.top();q.pop();
16         int u=x.pos;
17         if(x.val>dis[u])continue;
18         for(int i=head[u];~i;i=e[i].nex){
19             int v=e[i].to;
20             if(!vis[v]&&(dis[v]>e[i].w+dis[u])){
21                 dis[v]=e[i].w+dis[u];
22                 a.pos=v,a.val=dis[v];
23                 q.push(a);
24             }
25         }
26     }
27 }
28 /**
29 初始化:清空标记数组,初始化距离数组设为inf,起点距离设为0,开优先队列,搜索起点
30 搜索:取出队首并pop,如果队首节点u的当前最短路比u的原先的最短路大则跳过,否则遍历u的邻接点v,
31 如果v没有被访问过且u的最短路加上当前邻接边边权小于原先v的最短路,则更新v的最短路且搜索v
32 注意:在bool operator(const node &a)const{return a.w<w;}中原来是要a.w<w才能让优先队列中w小的优先,如果是a.w>w则是w大的优先
33 **/

 

转载于:https://www.cnblogs.com/Railgun000/p/11407457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值