这道题就是一道迪杰斯特拉的板子,没想到的是我想到了重载小于符号,没想到要定义优先队列
#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;
}