#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f;
struct Node{
int self;
int dis;
Node(int a,int b):self(a),dis(b){}
bool operator<(const Node &a)const{
return a.dis<dis;
}
};
vector<Node> edge[1000];
int n;
int dis[10000];
int book[10000];
int Dijkstra(int start){
priority_queue<Node> pq;
pq.push(Node(start,0));
for(int i=1;i<=n;i++)dis[i]=INF;
dis[start]=0;
while(!pq.empty()){
Node t=pq.top();
pq.pop();
if(book[t.self])continue;//如果作为中转站那么就不能再使用了
book[t.self]=1;
for(int i=0;i<edge[t.self].size();i++)//遍历能到达的节点
{
Node x=edge[t.self][i];//取出来Node对象
if(dis[x.self]>dis[t.self]+x.dis){//判断以这个点位中转站到其他点是不是更短
dis[x.self]=dis[t.self]+x.dis;//更新
pq.push(Node(x.self,dis[x.self]));//加入1到这个点和点的距离
}
}
}
return dis[n];//返回1---n的最短距离
}
int main(){
cin>>n;
int a,b,c;
for(int i=1;i<=n;i++){
cin>>a>>b>>c;
edge[a].push_back(Node(b,c));
edge[b].push_back(Node(a,c));
}
cout<<Dijkstra(1)<<endl;
}
Dijkstra(堆优化+领结表+优先队列(反序))
最新推荐文章于 2022-12-24 17:47:53 发布