公交线路(迪杰斯特拉)

这道题就是一道迪杰斯特拉的板子,没想到的是我想到了重载小于符号,没想到要定义优先队列
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int N=1000+5;
struct node{
int id,dis;
};
vector<node>v[N];
int w[N];
int n,m,s,t;
int vis[N];
bool operator<(node n1,node n2){
return n1.dis>n2.dis;
}
void solve(){
cin>>n>>m>>s>>t;
while(m--){
int a,b,x;
cin>>a>>b>>x;
v[a].push_back({b,x});
v[b].push_back({a,x});
}
memset(w,0x3f,sizeof(w));
priority_queue<node>q;//一定是优先队列
q.push({s,0});
w[s]=0;
while(!q.empty()){
node x=q.top();
q.pop();
if(vis[x.id])continue;
w[x.id]=x.dis;
vis[x.id]=1;
if(x.id==t)break;
for(int i=0;i<v[x.id].size();i++){
node u=v[x.id][i];
if(!vis[u.id]){
//if(u.dis+w[x.id]<w[u.id])可有可无
q.push({u.id,u.dis+x.dis});
}
}
}
if(w[t]>1e9)cout<<"-1";
else cout<<w[t];
}
int main(){
solve();
return 0;
}

浙公网安备 33010602011771号