全是优化。。。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cctype>
using namespace std;
int n,m,s,t;
struct Edge{
int v,w,next;
}edge[20000];
int dis[2510],head[2510],cut;
priority_queue<pair<int,int> >q;
inline int read(){
int s=0;
char ch=getchar();
while(isdigit(ch)){
s=s*10+ch-48;
ch=getchar();
}
return s;
}
inline void addEdge(int u,int v,int w){
edge[++cut]={v,w,head[u]};
head[u]=cut;
}
int main(){
memset(dis,0x3f,sizeof(dis));
n=read();m=read();s=read();t=read();
for(register int i=0;i<m;++i){
int u,v,w;
u=read();v=read();w=read();
addEdge(u,v,w);
addEdge(v,u,w);
}
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int u=q.top().second;
q.pop();
for(register int i=head[u];i;i=edge[i].next){
int v=edge[i].v,w=edge[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push(make_pair(-dis[v],v));
}
}
}
printf("%ld",dis[t]);
return 0;
}