京东 2019实习生招聘 Java开发类试卷在线考试
紧急疏散
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
体育场突然着火了,现场需要紧急疏散,但是过道真的是太窄了,同时只能容许一个人通过。现在知道了体育场的所有座位分布,座位分布图是一棵树,已知每个座位上都坐了一个人,安全出口在树的根部,也就是1号结点的位置上。其他节点上的人每秒都能向树根部前进一个结点,但是除了安全出口以外,没有任何一个结点可以同时容纳两个及以上的人,这就需要一种策略,来使得人群尽快疏散,问在采取最优策略的情况下,体育场最快可以在多长时间内疏散完成。
输入
第一行包含一个正整数n,即树的结点数量(1<=n<=100000)。
接下来有n-1行,每行有两个正整数x,y,表示在x和y结点之间存在一条边。(1<=x<=y<=n)
输出
输出仅包含一个正整数,表示所需要的最短时间
样例输入
6
2 1
3 2
4 3
5 2
6 1
样例输出
4
分析:
由于座位是树形,并且节点只能一个人一个人走(根节点没限制)所以我们只需统计根节点分支最多的元素个数就好。
代码:
import java.util.*;
/**
* @program: 个人demo
* @description: 每次都是pass
* @author: Mr.Hu
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
int n=in.nextInt();
List[] shu =new LinkedList[n+1]; //存树 shu[i] 表示节点i
for (int i = 1; i < n+1; i++) {
List<Integer> list=new LinkedList<>();
shu[i]=list;
}
for (int i = 0; i < n-1; i++) { //n-1行
int temp1=in.nextInt();
int temp2=in.nextInt();
int a=Math.min(temp1,temp2);
int b=Math.max(temp1,temp2);
shu[a].add(b);
}
int maxNum=1;
for (int i = 0; i < shu[1].size(); i++) {//遍历根节点1 看身边多少人
int temp=shortTime(shu,(Integer) shu[1].get(i));
if (temp>maxNum) maxNum=temp;
}
System.out.println(maxNum);
}
}
static int shortTime(List[] shu,int x){ //x 为根节点的元素数目(包括自身)
List<Integer> list=new ArrayList<>();
int num=1;
list.add(x);
while (!list.isEmpty()){
int tem=list.remove(0);
for (int i = 0; !shu[tem].isEmpty()&&i < shu[tem].size(); i++) {
num++;
list.add((Integer) shu[tem].get(i));
}
}
return num;
}
}
附录 执行结果