复杂度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 **/