因为队列中处理过的已经最短,所以可以不用处理连接到的 并且处理过的点
那么continue 一行就可以注释掉
只需要在已经处理过的点标记vis就可以了,所以本人注释掉了多余部分
看了很多算法讲解都有这个,很不理解。。。
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
int n,m,maxn;
int dist[2505];
bool vis[2505];
struct edge{
int to,w;
};
vector<edge>e[2505];
struct node{
int dis,pos;
bool operator < (const node &a) const{
return a.dis<dis;
}
};
priority_queue<node>q;
void init(){
for(int i=1;i<=n;i++){
dist[i]=maxn;
vis[i]=0;
}
dist[1]=0;
}
void dij(){
q.push({0,1});
while(!q.empty()){
node tmp=q.top();
q.pop();
int f=tmp.pos;
// if(vis[f]) continue;
vis[f]=1;
for(int i=0;i<e[f].size();i++){
int t=e[f][i].to;
if(!vis[t]){
if(dist[t]>dist[f]+e[f][i].w){
dist[t]=dist[f]+e[f][i].w;
q.push({dist[t],t});
}
}
}
}
}
signed main(){
maxn=0x7fffffff;
scanf("%d%d",&n,&m);
init();
for(int i=1;i<=m;i++){
int f,t,v;
scanf("%d%d%d",&f,&t,&v);
e[f].push_back({t,v});
e[t].push_back({f,v});
}
dij();
printf("%d",dist[n]);
}