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 **/