给定一个自由树,找到一个算法来找到在线性时间内运行的两个节点之间的最长路径。如果节点不存储它们的级别,这可能会这样做吗?如果是,怎么样?
如果节点确实存储了它们的级别,那么我会将下层节点向上移动到与另一个相同的级别。比我继续向上移动树直到节点重叠。距离将是每次节点向上移动树的总和。
答案 0 :(得分:0)
如果两个节点之间的所有边缘都不能使用多次,则路径是固定的。所以问题是要找到最低的共同祖先,你可以在这里阅读:http://en.wikipedia.org/wiki/Lowest_common_ancestor 有一个着名的算法来解决它,它在这里: http://en.wikipedia.org/wiki/Tarjan%27s_off-line_least_common_ancestors_algorithm
答案 1 :(得分:0)
我用以下代码解决http://www.spoj.pl/problems/PT07Z/作为学习python的练习:
def func(node):
global M
if (len(node)==0):
return 0
else:
s=[func(nodes[n]) for n in node]
s.sort()
m1=s[-1]+1
m2=0
if len(s)>1:
m2=s[-2]+1
M=max(M,m1+m2)
return m1
t=input()
nodes={}
for node in range(1,t+1):
nodes[node]=[]
for i in range(t-1):
s=raw_input().split()
a,b=int(s[0]),int(s[1])
nodes[a].append(b)
M=0
func(nodes[1])
print M
请注意,您可以按线性时间对节点进行排序,因为您知道节点从0到N,因此您将节点0移动到位置0 ..将节点5移动到位置5等。