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 <vector <int> f (n, vector <int> (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;
