#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n, m, s, head[N], num_edge;
int dis[N],cnt[N];
bool vis[N];
struct edge {
int v, next;
int w;
} e[N*4];
void add_edge(int u, int v, int w) {
e[++num_edge].v = v;
e[num_edge].w = w;
e[num_edge].next = head[u];
head[u] = num_edge;
}
void dijktra() {
memset(dis, 0x7f, sizeof(dis));
dis[s] = 0;
priority_queue<pair<int, int> > q;
q.push(make_pair(0, s));
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]||cnt[u]>=100)continue;
vis[u] = true;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (dis[v] < dis[u] + e[i].w/(cnt[u]+1))
continue;
cnt[v]=cnt[u]+1;
dis[v] = dis[u] + e[i].w/cnt[v];
q.push(make_pair(-dis[v], v));
}
}
}
signed main(void) {
int t;
cin >> n >> m >>t>> s;
for (int i = 1; i <= m; i++) {
int x, y,z;
scanf("%d %d %d", &x, &y, &z);
add_edge(x, y, z);
add_edge(y, x, z);
}
dijktra();
cout<<dis[t];
return 0;
}
也有设置上限啊