首页 > 试题广场 >

小O的叶子

[编程题]小O的叶子
  • 热度指数:148 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\,\,\,\,\,\,\,\,\,\,小O有一棵 n 个节点的树,小O会先删除一个节点,并删除与这个节点相连的边。小O想知道删除一个节点后,剩下的树最多有多少个叶子节点
\,\,\,\,\,\,\,\,\,\,如果一个节点有且仅有一个节点与之相连,那么这个点就是一个叶子节点

输入描述:
\,\,\,\,\,\,\,\,\,\,第一行输入一个整数 n\ (1 \leq n \leq 10^5 ),表示树的节点数。
\,\,\,\,\,\,\,\,\,\,此后 n-1 行,第 i 行输入两个整数 u_iv_i\ (1 \leq u_i, v_i \leq n;\ u_i \neq v_i) 表示树上第 i 条边连接节点 u_iv_i 。保证树联通,没有重边。


输出描述:
\,\,\,\,\,\,\,\,\,\,在一行上输出一个正整数,表示删除一个节点后,剩下的树最多有多少个叶子节点。

示例1

输入

5
1 2
1 3
1 4
1 5

输出

3

说明

删除节点 5 后,剩下的树最多有 3 个叶子节点。
对题解的一个优化?先建立树,记录原叶子总数,设为maxL。
之后找有没有度数为2的结点,有的话输出++maxL,否则输出--maxL。




import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int degree[]=new int[n+1];
        for(int i=1;i<n;i++){
            int u = in.nextInt();
            int v = in.nextInt();
            degree[u]++;
            degree[v]++;
        }
        int maxLeaves=0;
        for(int i=1;i<=n;i++){
            if(degree[i]==1){
                maxLeaves++;
            }
        }
        int flag=0;
        int res=0;
        for(int i=1;i<=n;i++){
            if(degree[i]==2){
                System.out.println(++maxLeaves);
                flag=1;
                break;
            }
            //res=Math.max(maxLeaves-degree[i],res);
            //注意,若无法去掉合适的分支,只能去掉叶子,去掉叶子可能性很多,无法定论
            //考虑来考虑去,似乎找不到度数2的时候去掉叶子还是最优解,那-1即可
        }
        if(flag==0)
            System.out.println(--maxLeaves);
    }
}

发表于 2025-09-17 20:27:32 回复(0)