//node dij
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N=2500+50;
int n,m,s,e,x,y,z;
int dis[N],used[N];
struct node{
int first,second;
};
bool operator <(node a,node b){
return a.first>b.first;
}
priority_queue<node> Q;
vector<int> tu[N],cost[N];
void build(int f,int t,int v){
tu[f].push_back(t);
cost[f].push_back(v);
return ;
}
void dij(int x,int t){
dis[x]=0;
//cout<<"hah";
Q.push(node{0,x});
while(used[t]==0&&!Q.empty()){
node u=Q.top();
Q.pop();
// printf("%d\n",u.second);
if(used[u.second]==1) continue;
used[u.second]=1;
for(int i=0;i<tu[u.second].size();i++){
int v=tu[u.second][i];
if(dis[v]>dis[u.second]+cost[u.second][i]){
dis[v]=dis[u.second]+cost[u.second][i];
Q.push(node{dis[v],v});
}
}
}
return ;
}
void init(){
memset(dis,0X7f,sizeof(dis));
return ;
}
int main(){
init();
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
build(x,y,z);
build(y,x,z);
}
dij(s,e);
printf("%d",dis[e]);
return 0;
}
重载运算符:
在大根堆里重载小于运算符;
在小根堆里重载大于运算符;
//pair dij
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N=2500+50;
int n,m,s,e,x,y,z;
int dis[N],used[N];
pair <int,int> u;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > Q;
vector<int> tu[N],cost[N];
void build(int f,int t,int v){
tu[f].push_back(t);
cost[f].push_back(v);
return ;
}
void dij(int x,int t){
dis[x]=0;
Q.push(make_pair(0,x) );
while(used[t]==0&&!Q.empty()){
u=Q.top();
Q.pop();
if(used[u.second]==1) continue;
used[u.second]=1;
for(int i=0;i<tu[u.second].size();i++){
int v=tu[u.second][i];
if(dis[v]>dis[u.second]+cost[u.second][i]){
dis[v]=dis[u.second]+cost[u.second][i];
Q.push(make_pair(dis[v],v));
}
}
}
return ;
}
void init(){
memset(dis,0X7f,sizeof(dis));
return ;
}
int main(){
init();
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
build(x,y,z);
build(y,x,z);
}
dij(s,e);
printf("%d",dis[e]);
return 0;
}
//spfa
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<deque>
#include<vector>
using namespace std;
const int N=2500+50;
int n,m,s,e,x,y,z;
int dis[N],used[N];
vector<int> tu[N],cost[N];
deque<int> Q;
void build(int f,int t,int v){
tu[f].push_back(t);
cost[f].push_back(v);
return ;
}
void spfa(int x){
dis[x]=0;
Q.push_back(x);
used[x]=1;
while(!Q.empty()){
int u=Q.front();
Q.pop_front();
used[u]=0;
for(int i=0;i<tu[u].size();i++){
int v=tu[u][i];
if(dis[v]>dis[u]+cost[u][i]){
dis[v]=dis[u]+cost[u][i];
if(used[v]==0){
int h=Q.front();
if(!Q.empty()&&dis[v]<dis[h]){
Q.push_front(v);
}
else Q.push_back(v);
used[v]=1;
}
}
}
}
return ;
}
void init(){
memset(dis,0X7f,sizeof(dis));
return ;
}
int main(){
init();
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
build(x,y,z);
build(y,x,z);
}
spfa(s);
printf("%d",dis[e]);
return 0;
}