#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include"race.h"
typedef long long ll;
#define vec vector
using namespace std;
struct Edge {
ll to, w;
bool operator<(Edge b) const {return to < b.to;}
};
const ll maxn = 2e5 + 1;
const ll maxk = 1e6 + 1;
ll ans, k, t = 0;
set<Edge> adj[maxn];
ll deleted[maxn], ofLength[maxk], s[maxn], lastUpdate[maxk];
void find_sizes(ll v, ll p = -1) {
s[v] = 1;
for (auto &e : adj[v])
if (e.to != p) {
find_sizes(e.to, v);
s[v] += s[e.to];
}
}
ll find_centroid(ll v, ll n, ll p = -1) {
for (auto &e : adj[v])
if (e.to != p && s[e.to] * 2 > n)
return find_centroid(e.to, n, v);
return v;
}
void use_dfs(ll v, ll dist, ll dist1 = 1, ll p = -1) {
for (auto &e : adj[v])
if (e.to != p)
use_dfs(e.to, dist + e.w, dist1 + 1, v);
if (dist > k) return;
if (lastUpdate[k - dist] == t)
ans = min(ans, ofLength[k - dist] + dist1);
if (dist == k)
ans = min(ans, dist1);
}
void apply_dfs(ll v, ll dist, ll dist1 = 1, ll p = -1) {
for (auto &e : adj[v])
if (e.to != p)
apply_dfs(e.to, dist + e.w, dist1 + 1, v);
if (dist > k) return;
if (lastUpdate[dist] < t)
ofLength[dist] = dist1;
else
ofLength[dist] = min(ofLength[dist], dist1);
lastUpdate[dist] = t;
}
void divide(ll v = 0) {
find_sizes(v);
ll cent = find_centroid(v, s[v]);
deleted[cent] = 1;
for (auto &e : adj[cent])
adj[e.to].erase({cent, e.w});
adj[cent].clear();
t++;
for (auto &e : adj[cent]) {
use_dfs(e.to, e.w);
apply_dfs(e.to, e.w);
}
// for (auto &l : usedLengths)
// ofLength[l] = 1e9;
// usedLengths.clear();
for (auto &e : adj[cent])
// if (!deleted[e.to])
divide(e.to);
}
// int main() {
// ll n;
// cin >> n >> k;
// // adj.assign(n, {});
// // deleted.assign(n, 0);
// // s.resize(n);
// // ofLength.assign(k + 1, 1e9);
// ans = 1e9;
// for (ll i = 0; i < n - 1; i++) {
// ll a, b, w;
// cin >> a >> b >> w;
// adj[a].push_back({b, w});
// adj[b].push_back({a, w});
// }
// divide();
// cout << (ans == 1e9 ? -1 : ans) << '\n';
// }
int best_path(int N, int K, int H[][2], int L[]) {
ll i;
k = K;
// deleted.assign(N, 0);
// adj.assign(N, {});
// s.resize(N);
// ofLength.assign(K + 1, 1e9);
ans = 1e9;
for (i = 0; i < N - 1; i++) {
adj[H[i][0]].insert({H[i][1], L[i]});
adj[H[i][1]].insert({H[i][0], L[i]});
}
divide();
return (ans == 1e9 ? -1 : 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... |