京东 2019实习生招聘 Java开发类试卷在线考试

京东 2019实习生招聘 Java开发类试卷在线考试

紧急疏散

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB

题目描述:

体育场突然着火了,现场需要紧急疏散,但是过道真的是太窄了,同时只能容许一个人通过。现在知道了体育场的所有座位分布,座位分布图是一棵树,已知每个座位上都坐了一个人,安全出口在树的根部,也就是1号结点的位置上。其他节点上的人每秒都能向树根部前进一个结点,但是除了安全出口以外,没有任何一个结点可以同时容纳两个及以上的人,这就需要一种策略,来使得人群尽快疏散,问在采取最优策略的情况下,体育场最快可以在多长时间内疏散完成。

输入

第一行包含一个正整数n,即树的结点数量(1<=n<=100000)。

接下来有n-1行,每行有两个正整数xy,表示在xy结点之间存在一条边。(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;
    }
}

附录 执行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值