问题描述
我尝试解决一个挑战,要求在python 3.0中要求树的直径(不一定是二叉树)。挑战实际上是找到一棵树的“周长”,这基本上是一棵树的直径(最长路径的长度)乘以3。
我创建了一个邻接表,并在树上运行了深度优先搜索(DFS),存储了子树的最大两个高度以及迄今为止遇到的最大直径。我认为我的逻辑很正确,但我似乎找不到代码问题。
codeforces编译器出现此错误:
对于PyPy 3.6,“超出测试用例1的内存限制”
适用于Python 3.7的“测试用例4的运行时错误”
问题参考:https://codeforces.com/gym/102694/problem/A
我的代码:
import sys,math
sys.setrecursionlimit(10**7)
def get_int(): # returns a list of integers after taking an input
return list(map(int,sys.stdin.readline().strip().split()))
def dfs(adj_list,u):
global visited
d,h=0,[0,0] #Diameter,Maximum two heights.
# print(u)
if adj_list[u]==[]:
# print(0,0)
return 0,0
else:
for v in adj_list[u]:
if visited[v]==True:
continue
else:
visited[v]=True
tmp_d,tmp_h=dfs(adj_list,v)
d=max(d,tmp_d)
tmp_h+=1
if tmp_h>h[1]:
if tmp_h>h[0]:
h[1],h[0]=h[0],h[1]
h[0]=tmp_h
else:
h[1]=tmp_h
d=max(h[0]+h[1],d)
# print(d,h[0])
return d,h[0]
if __name__ == "__main__":
N=int(input().strip())
adj_list=[[] for _ in range(N+1)] #Stores the adjacency list
adj_list[0]=None
root=1
for _ in range(N-1):
a,b=get_int()
adj_list[a].append(b)
adj_list[b].append(a)
visited=[False]*(N+1)
visited[1]=True
print(3*dfs(adj_list,root)[0])
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)