为什么下面这段代码会 MLE?
// author : yhy
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using Pii = pair<int, int>;
const int kMaxN = 5, kL = 21;
int n, m, mn[kMaxN], vis[kMaxN], ans[kMaxN];
vector<Pii> e[kMaxN];
struct Node {
int id, x, y, w;
bool operator<(Node _) { return w < _.w; }
} v[kMaxN];
struct Dsu {
int fa[kMaxN];
void Init() { iota(fa + 1, fa + n + 1, 1); }
void M(int x, int y) { fa[x] = y; }
int GetRoot(int x) {
return fa[x] == x ? x : fa[x] = GetRoot(fa[x]);
}
} s1, s2;
struct LCA {
int d[kMaxN], f[kMaxN][kL], mx[kMaxN][kL];
void Init(int x = 1, int fa = 0) {
f[x][0] = fa, d[x] = d[fa] + 1;
for (int i = 1; i < kL; i++) {
f[x][i] = f[f[x][i - 1]][i - 1];
mx[x][i] = max(mx[x][i - 1], mx[f[x][i - 1]][i - 1]);
}
for (auto [nxt, w] : e[x]) {
nxt != fa && (mx[nxt][0] = w, Init(nxt, x), 0);
}
}
Pii Lca(int x, int y, int ans = 0) { // {Lca, 值}
d[x] > d[y] && (swap(x, y), 0);
for (int i = 0; i < kL; i++) {
((d[y] - d[x]) >> i & 1) && (ans = max(ans, mx[y][i]), y = f[y][i]);
}
if (x == y) return {x, ans};
for (int i = kL - 1; i >= 0; i--) {
f[y][i] != f[x][i] && (ans = max(ans, max(mx[x][i], mx[y][i])), x = f[x][i], y = f[y][i]);
}
return {f[x][0], max(ans, max(mx[x][0], mx[y][0]))};
}
} l;
signed main() {
cin.tie(0)->ios::sync_with_stdio(0);
cin >> n >> m, s1.Init();
for (int i = 1; i <= m; i++) {
cin >> v[i].x >> v[i].y >> v[i].w, v[i].id = i;
}
sort(v + 1, v + m + 1);
for (int i = 1; i <= m; i++) {
int fx = s1.GetRoot(v[i].x), fy = s2.GetRoot(v[i].y);
if (fx != fy) {
s1.M(fx, fy), vis[i] = 1;
e[v[i].x].push_back({v[i].y, v[i].w});
e[v[i].y].push_back({v[i].x, v[i].w});
}
}
l.Init(), s2.Init();
fill(mn + 1, mn + n + 1, 1e9);
for (int i = 1; i <= m; i++) {
if (!vis[i]) {
int x = v[i].x, y = v[i].y;
auto [lca, mx] = l.Lca(x, y); ans[v[i].id] = mx;
for (; l.d[x] > l.d[lca]; x = s2.GetRoot(x)) {
mn[x] = v[i].w, s2.M(x, s2.GetRoot(l.f[x][0]));
}
for (; l.d[y] > l.d[lca]; y = s2.GetRoot(y)) {
mn[y] = v[i].w, s2.M(y, s2.GetRoot(l.f[y][0]));
}
}
}
for (int i = 1; i <= m; i++) {
if (vis[i]) {
ans[v[i].id] = mn[l.d[v[i].x] < l.d[v[i].y] ? v[i].y : v[i].x];
}
}
for (int i = 1; i <= m; i++) {
cout << ans[i] << '\n';
}
}