Dijstra裸题。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 2510
#define M 6210
#define inf 0x3f3f3f3f
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,s,t,d[N],h[N],num=0;
bool f[N];
struct edge{
int to,next,val;
}data[M<<1];
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();s=read();t=read();
while(m--){
int x=read(),y=read(),val=read();
data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;
data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val;
}memset(d,0x3f,sizeof(d));f[s]=1;
for(int i=h[s];i;i=data[i].next){
int y=data[i].to;
d[y]=std::min(d[y],data[i].val);
}
for(int k=2;k<=n;++k){
int j=0;
for(int i=1;i<=n;++i)
if(!f[i]&&d[i]<d[j]) j=i;
f[j]=1;if(j==t) break;
for(int i=h[j];i;i=data[i].next){
int y=data[i].to;
d[y]=std::min(d[y],d[j]+data[i].val);
}
}
printf("%d\n",d[t]);
return 0;
}