WA #7和$9
#include <cfloat>
#include <cstring>
#include <iostream>
#include <queue>
const int N = 2e3 + 9, M = 2e5 + 9;
struct Edge {
int v, nex;
long double w;
} e[M];
int ecnt, head[N];
long double dis[N];
bool vis[N];
void addEdge(int u, int v, int w) {
e[++ecnt].v = v;
e[ecnt].nex = head[u];
e[ecnt].w = w * 1.0;
head[u] = ecnt;
}
void dijkstra(int U) {
dis[U] = 0.0;
std::priority_queue<std::pair<long double, int>,
std::vector<std::pair<long double, int>>, std::greater<>>
Q;
Q.push({0.0, U});
while (!Q.empty()) {
long double Dis = Q.top().first;
int u = Q.top().second;
Q.pop();
if (vis[u]) continue;
vis[u] = true;
for (int i = head[u]; i; i = e[i].nex) {
int v = e[i].v;
long double w = e[i].w;
if (!vis[v] && dis[v] > w + Dis - Dis * w / 100.0) {
dis[v] = w + Dis - Dis * w / 100.0;
Q.push({dis[v], v});
}
}
}
}
int main() {
std::fill_n(dis, 2000, LDBL_MAX);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
addEdge(v, u, w);
}
int A, B;
scanf("%d%d", &A, &B);
dijkstra(A);
printf("%.8Lf\n", 100.0 / (1.0 - dis[B] / 100.0));
return 0;
}