#include "race.h"
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define eb emplace_back
#define mp make_pair
#define pb push_back
#define pp pop_back
#define endl '\n'
#define ff first
#define ss second
#define stop exit(0)
// #define sz(x) (int)x.size()
#define pause system("pause")
#define all(x) (x).begin(),(x).end()
#define deb(x) cout << #x << "-" << x  << endl
typedef char chr;
typedef string str;
typedef long long ll;
typedef vector<int> vii;
typedef pair<int,int> pii;
typedef pair <int,pii> tp;
const long long INF = LLONG_MAX;
const int inf = INT_MAX;
const int mod = 99824435;
const int MOD = 1e9 + 7;
const int dx[] = {0,0,-1,1};
const int dy[] = {-1,1,0,0};
const double PI = 2 * acos(0.0);
const int N = 2e5 + 5;
int n,k,a,b,c;
map <pii,int> l;
int sz[N],fix[N],dead[N];
vector <vii> v(N);
int s,u;
int len;
vector <vii> lst(N);
int ans;
vector <int> A;
void dfs(int x) {
    sz[x] = 1;
    fix[x] = 1;
    for (auto to:v[x]) {
        if (!fix[to] && !dead[to]) {
            dfs(to);
            sz[x] += sz[to];
        }
    }
}
void dfs1(int x) {
    s++;
    fix[x] = 1;
    for (auto to:v[x]) {
        if (!dead[to] && !fix[to]) {
            dfs1(to);
        }
    }
}
int dfs2(int x, int p) {
    for (auto to:v[x]) {
        if (dead[to] || to == p) continue;
        if (sz[to] > s/2) return dfs2(to,x);
    }
    return x;
}
void dfs3(int x, int p, int len,int d,vector <pii> &lst) {
    if (len > k) return;
    lst.pb({len,d});
    for (auto to:v[x]) {
        if (dead[to] || to == p) continue;
        dfs3(to,x,len+l[{to,x}],d+1,lst);
    }
}
void solve(int u) {
  A = vector <int>(k+1,inf);
  A[0] = 0;
  for (auto lw:v[u]) {
      if (dead[lw]) continue;
      vector <pii> lst;
      dfs3(lw,u,l[{lw,u}],1,lst);
      for (auto l:lst) {
          if (l.ff > k) continue;
          if (A[k-l.ff] != inf) ans = min(ans,l.ss+A[k-l.ff]);
      }
      for (auto l:lst) {
          if (l.ff > k) continue;
          A[l.ff] = min(A[l.ff],l.ss);
      }
  }
}
int best_path(int N, int K, int H[][2], int L[]) {
  n=N;
  k = K;
  for (int i = 1; i <= n-1; i++) {
    a = H[i][0];
    b = H[i][1];
    c = L[i];
    v[a].pb(b);
    v[b].pb(a);
    l[{a,b}] = c;
    l[{b,a}] = c;
  }
  bool ok = true;
  ans = inf;
  while (ok) {
      ok = false;
      for (int i = 1; i <= n; i++) {
          fix[i] = 0;
          sz[i] = 0;
      }
      for (int i = 1; i <= n; i++) {
          if (!fix[i] && !dead[i]) dfs(i);
      }
      for (int i = 1; i <= n; i++) {
          fix[i] = 0;
      }
      for (int i = 1; i <= n; i++) {
          if (!fix[i] && !dead[i]) {
              s = 0;
              dfs1(i);
              u = dfs2(i,-1);
              if (s > 1) {
                  ok = true;                    
                  solve(u);
                  dead[u] = 1; 
              }
          }
      }
  }
  if (ans == inf) ans = -1;
  return ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |