解题思路:先通过构造一棵树,这里用数组记录数的父节点最为合适,且需开第二个数组记录该节点的后代节点个数,在构造一个队列,用于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 人评分
P1002 (C语言代码)浏览:1019 |
C语言训练-大、小写问题 (C语言代码)浏览:649 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:821 |
1157题解浏览:769 |
1642题解浏览:784 |
核桃的数量 (C语言代码)浏览:726 |
有关字符,字符串的输入输出函数说明浏览:498 |
数组与指针的问题浏览:760 |
1197求助浏览:667 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:660 |