第一行输入一个整数
,表示树的节点数。
此后
行,第
行输入两个整数
和
表示树上第
条边连接节点
和
。保证树联通,没有重边。
在一行上输出一个正整数,表示删除一个节点后,剩下的树最多有多少个叶子节点。
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);
}
}