f (v) = какая-то функция в вершине v выберем корень в дереве f (v) = функция от поддерева вершины v f (v, 0) = суммарный вес выбранных вершин в поддереве v, если мы не выбрали v f (v, 1) = суммарный вес выбранных вершин в поддереве v, если мы выбрали v База: (для листьев) f (v, 0) = 0 f (v, 1) = weight[v] Пересчёт: f (v, 1) = sum {u ребёнок v} f (u, 0) + weight[v] f (v, 0) = sum {u ребёнок v} max [ f (u, 0), f (u, 1) ] Чтение графа: vector f (n, vector (2, 0)); void recur (int v, int p) { f[v][1] = weight[v]; f[v][0] = 0; for (auto u : adj[v]) { if (u == p) continue; recur (u, v); f[v][1] += f[u][0]; f[v][0] += max (f[u][0], f[u][1]); } } int root = 0; f (root, -1); cout << max (f[root][0], f[root][1]) << endl;