Задача: для каждого узла в дереве найти самый дальний узел, до которого можно добраться за некоторое количество подъемов
Вот мой код на C++:
Код: Выделить всё
#include
#include
using namespace std;
void down_to_leaves(int curr,
vector& list,
vector& dist,
vector& parent,
vector& visited) {
visited[curr] = true;
for (int child : list[curr]) {
if (visited[child]) {
continue;
}
parent[child] = curr;
down_to_leaves(child, list, dist, parent, visited);
dist[curr] = max(dist[child], dist[curr]);
}
dist[curr] += 1; // max(child_1, child_2, ...) + 1
}
int main() {
int t;
cin >> t;
for (int _ = 0; _ < t; _++) {
int n;
cin >> n;
vector list(n + 1);
vector parent(n + 1), dist(n + 1, -1);
vector visited(n + 1);
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
list[u].push_back(v);
list[v].push_back(u);
}
down_to_leaves(1, list, dist, parent, visited);
int q; cin >> q;
for (int i = 0; i < q; i++) {
int vertex, k, last = -1, ans = 0;
cin >> vertex >> k;
// climb up
for (int j = 0; j
Подробнее здесь: [url]https://stackoverflow.com/questions/79176508/solution-of-g-sakurako-and-chefir[/url]