public int countHighestScoreNodes(int[] parents) {
int n = parents.length;
long[] count = new long[n];
List<Integer>[] G = new ArrayList[n];
for (int i = 0; i < n; i++) {
G[i] = new ArrayList();
}
for (int i = 1; i < n; i++) {
G[i].add(parents[i]);
G[parents[i]].add(i);
}
long max = 0;
int ans = 0;
boolean[] marked = new boolean[n];
dfs(G, marked, count, 0);
for (int i = 0; i < n; i++) {
int cnt = 1;
for (int w : G[i]) {
if (parents[i] == w) {
cnt *= n - count[i];
}else{
cnt *= count[w];
}
}
if (cnt > max) {
max = cnt;
ans = 1;
} else if (cnt == max) {
ans++;
}
}
return ans;
}
public int dfs(List<Integer>[] G,boolean[] marked,long[] count, int v) {
int cnt = 1;
marked[v] = true;
for (int w : G[v]) {
if (!marked[w]) {
cnt += dfs(G, marked, count, w);
}
}
count[v] = cnt;
return cnt;
}
lc-2049
原创
©著作权归作者所有:来自51CTO博客作者wx5be5864e766ab的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
BZOJ 2049 洞穴勘测
又一道LCT模板题。 如何找是不是在同一棵树上?只要找深度最小的点是不是相同的点即可。 也就是splay最左边的那个点。
#include i++ #define ios 模板题