模板
int Dijkstra(){
//初始化dist[],设置起止点距离为0
dist[1]=0;
//创建堆
priority_queue<PII,vector<PII>,greater<PII> >Heap;
//将起始点插入堆中 Heap.push({距离,该点id})
Heap.push({0,1});
//n个点循环n次
for(n){
//获取当前堆顶元素(最小值)并将该元素从堆中弹出
PII t=Heap.top();
Heap.pop();
//判断该点是否合法,并将其状态设置为true
int id=t.second,d=t.first;
if(st[id]) continue;
st[id]=true;
//用这个点t来更新与之相关的点的dist(遍历该点的邻接表)
//如果该点距离值发生改变,将其重新入堆
//Heap.push({dist[k],k});
}
}
C++ 代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N=1.5e5+10;
#define PII pair<int,int>
int dist[N],n,m;
int e[N],ne[N],h[N],idx,w[N];
bool st[N];
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int dijkstra(){
memset(dist,0x3f,sizeof dist);
dist[1]=0;
priority_queue<PII,vector<PII>,greater<PII> >Heap;
Heap.push({0,1});
for(int i=0;i<n;i++){
PII t=Heap.top();
Heap.pop();
int id=t.second,d=t.first;
if(st[id]) continue;
st[id]=true;
for(int j=h[id];j!=-1;j=ne[j]){
int k=e[j];
if(dist[k]>d+w[j]){
dist[k]=d+w[j];
Heap.push({dist[k],k});
}
}
}
if(dist[n]==0x3f3f3f3f) return -1;
return dist[n];
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
while(m--){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
cout<<dijkstra()<<endl;
return 0;
}
重点代码
#define PII pair<int,int>
priority_queue<PII,vector<PII>,greater<PII> >Heap;
Heap.push({0,1});
PII t=Heap.top();