LeetCode 2049. 统计最高分的节点数目

题意

一颗完整的树,拆掉一个节点,将原树分成了若干个连通块,将所有连通块大小 连乘作为分数。
n个节点操作一遍 得到分数最大值。
有多少个节点 能得到分数最大值。

思路

1.计算以各个节点为根的子树大小sum[i]。
2.当拆掉u节点时,它的分数是它所有子节点树的大小的连乘,再乘以 (n-以u为节点的乘积) 除非u是根节点
3.注意连乘 容易超过int范围 要开long long

 class Solution {
public:
  //计算每个节点分数
   int dfs(int u,vector<int>& sum,vector<vector<int>>& e){
        if(sum[u])return sum[u];
        if(e[u].size()==0)return sum[u]=1;
        int res=1;
        for(int i=0;i<e[u].size();i++){
            res+=dfs(e[u][i],sum,e);
        }           
        return sum[u]=res;
    }
    int countHighestScoreNodes(vector<int>& p) {
       int n=p.size(),ans=0;
        vector<int>sum(n,0);//存以i为根子树大小
        vector <vector<int>> e(n, vector<int> ());  //存边

       //初始化 为每个根节点的子节点
        for(int i=0;i<n;i++){
            if(p[i]!=-1)e[p[i]].push_back(i);
        }
        
       dfs(0,sum,e);

        long long res=0;
        for(int i=0;i<n;i++){
                long long  t=1;
                for(int j=0;j<e[i].size();j++){//子树
                     t*=sum[e[i][j]];
                }
                if(p[i]!=-1)t*=n-sum[i];//根
                 if(res<t){
                    ans=1;
                    res=t;
                }
              else  if(res==t){
                    ans++;
                }
        }
        return ans;    
    }

};

比赛中想岔了,因为只看了简单样例,以为乘sum[p[i]]-sum[i]。也没改long long 说明对树题目还是不熟悉

posted @ 2021-10-25 23:34  liv_vil  阅读(115)  评论(0)    收藏  举报