基础Dijkstra(邻接矩阵展示)
核心概念:每次找到起点最短的边
核心代码
int dis[N],vis[M];
void Dij(){
memset(dis,0xef,sizeof(dis));
memset(vis,0xef,sizeof(vis));
dis[0]=0;//以0为起点
for(int i=0; i<N; i++){
int x=-1;//到起点最小的点
for(int j=0; j<N; j++){
if(!vis[j] && (x==-1 || dis[j]<dis[x]))
x=j;
}
vis[x]=1;
for(int j=0; j<N; j++){
dis[j]=min(dis[j],dis[x]+mp[x][j]);//邻接表更快
}
}
}
Dijkstra堆优化(邻接表展示)
优先队列
邻接表
//点数N 边数M
int head[N],value[M],edge[M],nex[M],index=1;
void add(int u,int v,int w){//类似于头插法
value[index]=w;
edge[index]=v;
nex[index]=head[u];
head[u]=index++;
}
核心代码
//pair<int,int> {最短长度,点}
priority_queue<pair<int,int> , vector<pair<int,int> > , greater<pair<int,int> > > p;//小顶堆
int dis[N],vis[N];
void Dij(){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[0]=0;
q.push({0,0});
while(p.empty()==0){
int x;
x=p.top().second;p.pop();
if(vis[x])
continue;
vis[x]=1;
for(int i=head[x]; i!=-1; i=nex[i]){
if(dis[edge[i]]>dis[x]+value[i]){
dis[edge[i]]=dis[x]+value[i];
q.push({dis[edge[i]],edge[i]});
}
}
}
}
自用模板,有错误请指正。