SPFA 模板
#include<bits/stdc++.h>
using namespace std;
const int N=20001;
int n,m,s,t;
int head[N],next[N],to[N],v[N];
int cnt;//第几条边
queue<int> w;
bool r[N];
int g;
int dis[N];
int past;
void add(int a,int b,int c)//从a点去往b点
{
cnt++;
next[cnt]=head[a];//next的第cnt条边记录head[a]的上一个点
head[a]=cnt;
to[cnt]=b;
v[cnt]=c;
}
void spfa()
{
w.push(s);
r[s]=1;
dis[s]=0;
while(!w.empty())
{
g=w.front();
w.pop();
r[g]=0;
for(register int i=head[g];i;i=next[i])
{
past=to[i];
if(dis[past]>dis[g]+v[i])
{
dis[past]=dis[g]+v[i];
/*if(!r[past])
{*/
w.push(past);
//r[past]=1;
//}
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for(register int i=1,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
memset(dis,0x3f,sizeof(dis));
spfa();
printf("%d",dis[t]);
return 0;
}