Top.Mail.Ru
Ответы

Задача №7 региона по информатике 2018. Мое решение проваливается на 24 тесте. Что с ним не так?

В лаборатории теоретической пиротехники изучают новые технологии организации фейерверков. Фейерверк представляется как корневое дерево, а поскольку в мощном фейерверке его элементы также взрываются, порождая новые фейерверки, то ученые вводят операцию возведения корневого дерева в степень.

Корневое дерево содержит одну или несколько вершин. Одна из вершин выделена и называется корнем дерева, для каждой из остальных вершин ровно одна другая вершина является родителем. При этом от любой вершины можно добраться до корня, последовательно переходя от вершины к ее родителю. Вершина, которая не является родителем никакой другой вершины, называется листом. Если вершина x является родителем вершины y, то вершина y является ребенком вершины x. Будем говорить, что вершина и ее родитель соединены ребром.
Фейерверк задается своим базовым деревом T и мощностью m. Фейерверк представляется деревом, которое получается в результате возведения дерева T в степень m. Операция возведения дерева в степень устроена следующим образом. Если m = 1, то результат T1 — само дерево T. Для m > 1 рассмотрим дерево Tm – 1. Выполним следующую операцию: для каждого листа x дерева Tm – 1 создадим копию дерева T и назначим лист x родителем корня соответствующей копии. Получившееся дерево будет деревом Tm.

Путем в дереве называется последовательность вершин, в которой две соседние вершины соединены ребром. Все вершины в пути должны быть различны.

Для того, чтобы оценить красоту фейерверка, необходимо определить, какое максимальное количество вершин может содержать путь в дереве, которым представляется фейерверк. На рис. 3 приведен путь в дереве T2, содержащий максимальное количество вершин. Таким образом, красота фейерверка с базовым деревом T и мощностью 2 равна 10.

Требуется написать программу, которая по описанию дерева T и натуральному числу m определяет красоту фейерверка с базовым деревом T и мощностью m.

Мое решение:

#include
#include

using namespace std;

const int maxN = 200001;

int n, m, ud, max_wae = -1, diam = -1, d;
vector<vector > g(maxN);
vector is_list(maxN, true);
vector used(maxN, false);

void dfs1 (int now, int put) {
used[now] = true;
if (is_list[now]) {
if (put > max_wae) {
ud = now;
max_wae = put;
}
}
else {
put++;
for (vector::iterator i = g[now].begin(); i != g[now].end(); ++i) {
if (!used[*i]) {
dfs1 (*i, put);
}
}
}
}

void dfs2 (int now, int put) {
used[now] = true;
if (is_list[now]) {
if (put > diam) diam = put;
}
else {
put++;
for (vector::iterator i = g[now].begin(); i != g[now].end(); ++i) {
if (!used[*i]) {
dfs2(*i, put);
}
}
}
}

int main () {
cin >> n >> m;
for (int i = 2; i <= n; i++) {
cin >> d;
g[i].push_back(d);
g[d].push_back(i);
is_list[d] = false;
}
dfs1 (1, 1);
for (int i = 1; i <= n; i++) used[i] = false;
is_list[ud] = false;
dfs2 (ud, 1);
cout << max_wae*2*(m-1) + diam;
}

По дате
По рейтингу
Аватар пользователя
Мастер
7лет

Да это же "Красота фейерверка" 2 тура :) К сожалению, не решал, не подскажете, где проверяете решения?