时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为1。其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。 输入格式 输入的第一行包含两个整数n, m,分别表示交换机的台数和终端电脑的台数。 输出格式 输出一个整数,表示消息传递最多需要的步数。 样例输入 4 2 样例输出 4 样例说明 样例的网络连接模式如下,其中圆圈表示交换机,方框表示电脑: 样例输入 4 4 样例输出 4 样例说明 样例的网络连接模式如下: 评测用例规模与约定 前30%的评测用例满足:n ≤ 5, m ≤ 5。 |
明显就是求树的直径,从一个点出发dfs或bfs找一个离它最远的点,再从该点出发找一个最远的点,这是两点间的距离就是树的直径,两遍dfs/bfs即可。
def dfs(u,dist):
global maxv #pyhon的递归里,全局需要声明
global aim
vis[u] = 1
#print(maxv)
#print(aim)
if maxv < dist:
maxv = dist
aim = u
#print(3)
for i in graph[u]:
#print(3)
if not vis[i]:
dfs(i,dist+1)
#return maxv,
while True:
try:
graph = [[]for i in range(20005)]
n,m = map(int,input().split())
x = [0 for _ in range(20005)]
c= [0 for _ in range(20005)]
x[2:] = map(int,input().split())
#print(x)
for i in range(2,n+1):
graph[i].append(x[i])
graph[x[i]].append(i)
c[n+1:] = map(int,input().split())
for i in range(n+1,n+m+1):
graph[i].append(c[i])
graph[c[i]].append(i)
#print(c)
maxv = -1
aim = 0
vis = [0 for i in range(20005)]
dfs(1,0)#当前遍历的点,以及从起点到它的距离
#print(3)
maxv = -1
vis = [0 for i in range(20005)]
dfs(aim,0)
print(maxv)
except:
break