紧急疏散(python)

题目描述:

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

 输入:

第一行包括一个整数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

#定义一个列表,存放和1直接相连接的值,不直接相连的先放到一个临时列表中,一层一层过滤
import sys

#all_list用于存放直接和1相连的数据,比如2、4和1直接相连,则all_list为[[2],[4]]
#temp用于存放不和1直接相连的数据组,比如[2,3],[4,5]不和1直接相连,则temp为[[2,3],[4,5]]
all_list = list()
temp = list()

#先取出第一行的值,然而后面并没有用到
num = int(sys.stdin.readline().strip())

line = sys.stdin.readline().strip()
while len(line):
    two = list(map(int,line.split(' ')))
    #两个有其中一个是1,将另一个作为列表放入all_list中,否则一组数都放到temp中去
    if two[0] == 1 or two[1] == 1:
        #判断两个哪个不是1
        if two[0] == 1:
            all_list.append([two[1]])
        else:
            all_list.append([two[0]])
    else:
        temp.append(two)
    line = sys.stdin.readline().strip()
    
#所有数据都遍历过一遍,并且所有和1连接的值都以list的格式放入到all_list中
index_ = list()
while len(temp) != 0:
    #遍历一遍temp列表,看里面有没有和all_list中相连接的
    for i in range(len(temp)):
        #每一个temp中的值都要和all_list中的每一个值进行配对
        for j in range(len(all_list)):
            #两个其中在all_list中,将另一个放入
            if temp[i][0] in all_list[j] or temp[i][1] in all_list[j]:
                if temp[i][0] in all_list[j]:
                    all_list[j].append(temp[i][1])
                else:
                    all_list[j].append(temp[i][0])
                index_.append(temp[i])
    for i in range(len(index_)):
        temp.remove(index_[i])
                    
#判断all_list中最长的那个列表的长度
max_len = 0
for i in range(len(all_list)):
    len_ = len(all_list[i])
    if len_ > max_len:
        max_len = len_
        
print(max_len)

菜鸟一枚,代码仅供参考,如有问题,望指正~


版权声明:本文为weixin_40510799原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>