前言:这个题目看着就像一个类似树的重心的问题,我们可以直接一遍dfs进行通过
const int N = (int)1e5 + 5;
class Solution {
public:
int countGoodNodes(vector<vector<int>>& edges) {
int n = edges.size() + 1;
ans = 0;
for (int i = 0; i <= n; i++) num[i] = 0;
for (int i = 0; i < edges.size(); i++) {
add(edges[i][0], edges[i][1]);
}
dfs(0, -1);
return ans;
}
void dfs(int u,int fa) {
int cnt = 0;
int child = 1;
for (auto v : e[u]) {
if (v == fa) continue;
dfs(v, u);
}
int flag = 0; int re;
int ok = 1;
for (auto v : e[u]) {
if (v == fa) continue;
if (flag == 0) {
re = num[v]; flag = 1;
}
else {
if (num[v] != re) ok = 0;
}
child += num[v];
}
if (ok) ans++;
num[u] = child;
}
vector<int> e[N];
int num[N];
void add(int a, int b) {
e[a].push_back(b);
e[b].push_back(a);
}
int ans;
};