#include <iostream>
#include <cstring>
#include <queue>
#define ll long long
using namespace std;
const int Max = 4e4+10;
const int Max2=2e4+10;
int n,m,ans=0x3f3f3f3f;int s,t;
int Ver[Max],Head[Max],Next[Max],Edge[Max],tot;
int d[101][Max2];
bool v[101][Max2];
void add(int x,int y,int z){
Edge[++tot]=z;Ver[tot]=y;Next[tot]=Head[x];Head[x]=tot;
}
struct node{
int l,kk,id;
bool operator < (const node &A)const{
return l>A.l;
}
};
priority_queue<node>q;
void dij(int ss){
memset(d,0x3f,sizeof d);
memset(v,0,sizeof v);
d[0][ss]=0;
q.push(node{0,0,ss});
while(!q.empty()){
int x=q.top().id,k=q.top().kk;q.pop();
if(k>100){
ans=min(ans,d[k][x]);
}
else{
if(!v[k][x]){
v[k][x]=1;
for(int i = Head[x];i;i=Next[i]){
int y=Ver[i],w=Edge[i];
if(d[k+1][y]>d[k][x]+w/(k+1)){
d[k+1][y]=d[k][x]+w/(k+1);
q.push(node{d[k+1][y],(k+1),y});
}
}
}
}
}
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i = 1;i <= m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dij(t);
for(int i = 0;i <= 100;i++){
ans=min(ans,d[i][s]);
}
printf("%d",ans);
return 0;
}
测评记录