时间复杂度O(eloge),在n的数量级>=1e5时必须采用这种堆优化+邻接表方式 。
int vis[MAXN];
int pre[MAXN];//前驱节点
int dis[MAXN];//距离源的长度
struct node{
int vex,w;//节点和距离源点的最优距离
friend bool operator < (node a,node b){//重载运算符,使其按边长从小到大弹出
return a.w>b.w;//这里也可以写做dis[a.vex]>dis[b.vex];
}
node(){
this->vex=0; this->w=0;
}
node(int v,int w){
this->vex=v; this->w=w;
}
};
priority_queue<node>que;
vector<node>vec[MAXN];
void dijkstra(){
memset(vis,0,sizeof(vis));
memset(dis,inf,sizeof(dis));
dis[src]=0; pre[src]=src;//源的距离为0,前驱节点为自己
que.push(node(1,0));
while(!que.empty()){
node now=que.top();
que.pop(); int tmpv=now.vex;
if(visit[tmpv]) continue;
visit[tmpv]=1;
for(int i=0;i<vec[tmpv].size();i++){
int nxtv=vec[tmpv][i].vex;
if(!visit[nxtv]&&dis[tmpv]+vec[tmpv][i].w<dis[nxtv]){//如果可以松弛该边
dis[nxtv]=dis[tmpv]+vec[tmp][i].w;
pre[nxtv]=tmpv;
que.push(node(nxtv,dis[nxtv]));
}
}
}
}