解题思路:先通过构造一棵树,这里用数组记录数的父节点最为合适,且需开第二个数组记录该节点的后代节点个数,在构造一个队列,用于DFS,在遍历每一层的时候去掉这一层中后代节点数最大的节点,最后加上每层遍历后队列元素数量。
注意事项:
参考代码:
import java.util.Scanner;
import java.util.ArrayList;
public class Main {
static Scanner sc1=new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=sc1.nextInt(),p=sc1.nextInt();
myclass m1=new myclass(n,p);
System.out.println(m1.dfs());
}
}
class myclass{
int n;
int[] sz;//记录父节点index
int[] szsz;//记录后代节点个数
public myclass(int n1,int p)
{
n=n1;
sz=new int[n+1];
szsz=new int[n+1];
int z,y;
for(int i=0;i<n+1;i++)
{
szsz[i]=1;
sz[i]=0;
}
for(int i=0;i<p;i++)
{
z=Main.sc1.nextInt();
y=Main.sc1.nextInt();
if(z<y)
{
sz[y]=z;
for(int i1=z;sz[i1]!=i1;i1=sz[i1])
{
szsz[i1]+=szsz[y];
}
}
else
{
sz[z]=y;
for(int i1=y;sz[i1]!=i1;i1=sz[i1])
{
szsz[i1]+=szsz[z];
}
}
}
}
int dfs()//
{
int ans=1;
ArrayList<Integer> l1=new ArrayList<Integer>();
l1.add(1);
l1.add(-1);
int c=0;
while(!l1.isEmpty())
{
int max=0,maxh=0,maxhh=0;
for(;;)
{
c=l1.remove(0);
if(-1==c&&l1.size()==0) return ans;
if(-1==c)
{
l1.remove(maxhh);
ans+=l1.size();
l1.add(-1);
break;
}
for(int j=1;j<n+1;j++)
{
if(c==sz[j])
{
l1.add(j);
if(szsz[j]>max)
{
max=szsz[j];
maxhh=maxh;
}
maxh++;
}
}
}
}
return ans;
}
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复