rt,P4149 在求树的重心时会莫名其妙 RE/MLE,有聪明的同学说是因为没有开无限栈的问题,所以怎么开无限栈防 RE?
#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = j; i <= k; ++i)
#define drep(i, j, k) for(int i = j; i >= k; --i)
#define pb push_back
#define fir first
#define sec second
#define int long long
#define PII pair<int, int>
#define inf 0x3fffffff
using namespace std;
const int N = 2e6 + 5;
const int M = 2e7 + 5;
int dp[N], siz[N], dis[N][2], q[N], c[N][2], a[N], tot, sum, rt, ans, vis[N], mn[M];
int n, m, u, v, w, k;
vector<PII> e[N];
inline void get_rt(int u, int fa) {//<---RE 在这,加 inline 也没用
dp[u] = 0, siz[u] = 1;
for(auto ed : e[u]) {
int v = ed.fir, w = ed.sec;
if(v == fa || vis[v]) continue;
get_rt(v, u);
siz[u] += siz[v];
dp[u] = max(dp[u], siz[v]);
}
dp[u] = max(dp[u], sum - siz[u]);
if(dp[u] < dp[rt]) rt = u;
}
void get_dis(int u, int fa) {
c[++tot][0] = dis[u][0], c[tot][1] = dis[u][1];
for(auto ed : e[u]) {
int v = ed.fir, w = ed.sec;
if(vis[v] || v == fa) continue;
dis[v][0] = dis[u][0] + w;
dis[v][1] = dis[u][1] + 1;
get_dis(v, u);
}
}
void Count(int u) {
int cnt = 0;
for(auto ed : e[u]) {
int v = ed.fir, w = ed.sec;
if(vis[v]) continue;
tot = 0, dis[v][0] = w, dis[v][1] = 1, get_dis(v, u);
rep(i, 1, tot)
if(k >= c[i][0]) ans = min(ans, mn[k - c[i][0]] + c[i][1]);
rep(i, 1, tot)
if(c[i][0] < 1e9) a[++cnt] = c[i][0], mn[c[i][0]] = min(mn[c[i][0]], c[i][1]);
}
rep(i, 1, cnt)
mn[a[i]] = 1e9;
}
void solve(int u) {
vis[u] = 1, mn[0] = 0, Count(u);
for(auto ed : e[u]) {
int v = ed.fir, w = ed.sec;
if(vis[v]) continue;
dp[0] = n, rt = 0, sum = siz[v];
get_rt(v, u), solve(rt);
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(nullptr), cout.tie(nullptr);
// freopen("1.in", "r", stdin);
memset(mn, 0x3f, sizeof mn);
cin >> n >> k, sum = dp[0] = n, ans = n + 1;
rep(i, 1, n - 1) cin >> u >> v >> w, ++u, ++v, e[u].pb({v, w}), e[v].pb({u, w});
get_rt(1, 0);
solve(rt);
cout << (ans <= n ? ans : -1);
return 0;
}