#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> graph;
vector<int> h;
vector<int> subtree_sum;
int n, k;
int cuts = 0;
void dfs(int node, int parent) {
subtree_sum[node] = h[node];
for (int neighbor : graph[node]) {
if (neighbor == parent) continue;
dfs(neighbor, node);
// Если поддерево соседа уже отрезано (сумма = 0), пропускаем
if (subtree_sum[neighbor] == 0) continue;
// Проверяем, нужно ли делать разрез
if (subtree_sum[node] + subtree_sum[neighbor] > k) {
cuts++;
} else {
subtree_sum[node] += subtree_sum[neighbor];
}
}
// Если текущая вершина сама превышает k, это невозможно - ошибка в данных
// Но по условию каждый перец имеет неотрицательную остроту и k >= 0
// Значит, каждый отдельный перец всегда ≤ k
}
int main() {
cin >> n >> k;
h.resize(n);
subtree_sum.resize(n);
graph.resize(n);
// Читаем остроты перцев
for (int i = 0; i < n; i++) {
cin >> h[i];
// Проверяем, что острота каждого перца ≤ k
if (h[i] > k) {
// Это невозможно по условию, но на всякий случай
cout << -1 << endl;
return 0;
}
}
// Строим дерево
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
u--; v--;
graph[u].push_back(v);
graph[v].push_back(u);
}
dfs(0, -1);
cout << cuts << endl;
return 0;
}
| # | 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... |