Algorithm 求自由树中两节点间最长距离的线性时间算法?

Algorithm 求自由树中两节点间最长距离的线性时间算法?,algorithm,data-structures,tree,Algorithm,Data Structures,Tree,给定一棵自由树,找到一个算法,以找到在线性时间内运行的两个节点之间的最长路径。如果节点不存储其级别,是否可以执行此操作?如果是,如何进行 如果节点确实存储了它们的级别,那么我会将树中较低的节点向上移动到与另一个节点相同的级别。然后我会一直向上移动直到节点重叠。距离将是节点在树上向上移动时的每次总和。如果两个节点之间的所有边不能被多次使用,则路径是固定的。所以问题是要找到最低的共同祖先,你可以在这里阅读: 这里有一个著名的算法来解决这个问题: 如果两个节点之间的所有边不能被多次使用,则路径是固定的

给定一棵自由树,找到一个算法,以找到在线性时间内运行的两个节点之间的最长路径。如果节点不存储其级别,是否可以执行此操作?如果是,如何进行


如果节点确实存储了它们的级别,那么我会将树中较低的节点向上移动到与另一个节点相同的级别。然后我会一直向上移动直到节点重叠。距离将是节点在树上向上移动时的每次总和。

如果两个节点之间的所有边不能被多次使用,则路径是固定的。所以问题是要找到最低的共同祖先,你可以在这里阅读: 这里有一个著名的算法来解决这个问题:

如果两个节点之间的所有边不能被多次使用,则路径是固定的。所以问题是要找到最低的共同祖先,你可以在这里阅读: 这里有一个著名的算法来解决这个问题:

作为学习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等等。

作为学习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等。

LCA在这方面有何帮助?假设您已经知道要检查的节点。LCA在这里有什么帮助?假设你已经知道要检查的节点。我不确定自由树是什么,但是你能从节点a使用广度优先搜索来找到远离节点a的节点b吗。然后对节点b进行广度优先搜索,找到距离b较远的节点c。答案是b和c之间的距离。我不确定自由树是什么,但你能从节点a使用广度优先搜索来找到远离节点a的节点b吗。然后对节点b进行广度优先搜索,找到距离b较远的节点c。答案是b和c之间的距离?。