牛牛打怪兽
思路
统计从结点 到叶子节点路径权值和小于等于 的叶子数量即可。
时间复杂度:
Code
/** * struct Point { * int x; * int y; * }; */ class Solution { private: #define maxn 100010 vector<int> g[maxn]; int val[maxn]; int ans; public: /** * 从 1 到 n 每个结点的权值。 * @param n int整型 * @param Edge Point类vector (u, v) 集合 * @param q int整型 * @param Query Point类vector Point.x 为题中 r, Point.y题中 为 x * @return long长整型vector */ void dfs(int x, int fa = 0, int sum = 0) { sum += val[x]; if (sum > 2) return; if (g[x].size() == 1 && x != 1) ++ans; for (auto v: g[x]) { if (v == fa) continue; dfs(v, x, sum); } } int solve(int n, vector<Point>& Edge, vector<int>& f) { // write code here for (int i = 1; i <= n; ++i) { g[i].clear(); val[i] = f[i-1]; } ans = 0; for (auto cur: Edge) { g[cur.x].push_back(cur.y); g[cur.y].push_back(cur.x); } if (n > 1) dfs(1); else ans = 1; return ans; } };