Algorithm 验证无向树中最长路径的不同方法

Algorithm 验证无向树中最长路径的不同方法,algorithm,path,tree,Algorithm,Path,Tree,我在尝试这个问题- 在未加权的无向树上寻找最长的路径 方法1 简单直观的解释- 我们从节点X开始,它总是试图到达作为最长路径(比如YZ)一部分的节点。因此,通过最长路径(例如在节点N处)。从那以后,它将有两个选择——要么在最长路径的一侧(新西兰)走,要么在另一侧(纽约)走。这将需要更长的时间(纽约和YZ)。因此,我们最终将到达最长路径(节点Y)的一端。现在,如果X选择的路径不是与最长路径(YZ)重叠的路径(max(NY,NZ)),那么概括地说,这意味着存在一条比最长路径(YZ)更长的路径 用矛盾

我在尝试这个问题- 在未加权的无向树上寻找最长的路径

方法1 简单直观的解释- 我们从节点X开始,它总是试图到达作为最长路径(比如YZ)一部分的节点。因此,通过最长路径(例如在节点N处)。从那以后,它将有两个选择——要么在最长路径的一侧(新西兰)走,要么在另一侧(纽约)走。这将需要更长的时间(纽约和YZ)。因此,我们最终将到达最长路径(节点Y)的一端。现在,如果X选择的路径不是与最长路径(YZ)重叠的路径(max(NY,NZ)),那么概括地说,这意味着存在一条比最长路径(YZ)更长的路径

用矛盾证明-

案例1-
假设有一条路径XT与YZ不重叠,且长度大于XN+max(NY,NZ)。 假设S是N和T的最低共同祖先。现在,让长度(UV)是一个函数,它告诉2个节点u和v之间的路径长度

We know, Length(XT) = Length(XS) + Length(ST)                 ..... 1
         Length(XY) = Length(XS) + Length(SN) + Length(NY)    ..... 2     
         Length(XZ) = Length(XS) + Length(SN) + Length(NZ)    ..... 3
在不丧失一般性的情况下,让我们假设,
Length(NY)>Length(NZ)。。。4
现在,我们声明
Length(XT)>Length(XY)。
因此,使用1,2和4, 我们得到,
Length(ST)>Length(SN)+Length(NY)。
但是,在这种情况下,在最长路径YZ中,如果我们将NY替换为NT,即NS+ST,我们将得到比YZ更长的路径。那么YZ就不会是最长的路了。因此,一个矛盾

因此证明了
XN+max(NY,NZ)
是从X开始的最长路径,并将我们带到Y,Y被证明是绝对最长路径的一端

类似地,我们可以证明情况2-当XT与YZ部分重叠时。这是留给读者的练习

方法2(有待验证是否正确) 我的解决方案以及akul建议的更正(

(我可能很久以前读过这篇文章或类似的文章,但无法关联/回忆)-

所以,在这里,我基本上是沿着最长的路径逐渐变细, 从所有边界(阶数1)节点开始,作为最长路径 是连接两个1度节点(最远的节点)的节点


我的问题-这种方法(方法2)有效吗?

我同意@j_random_hacker的观点,即这种方法是有效的,并且可以用矛盾来证明:

证明两个端点节点的阶数必须为1

  • 假设存在阶数为N的结束节点A,其中N>1
  • 请注意,路径必须包含N条边中的一条
  • 请注意,通过另一条边退出将扩展路径
  • 因此,A不能是结束节点
证明阶数为1的节点(两个端点节点除外)不能是路径的一部分

  • 假设有一个阶数为1的节点B是路径的一部分,但不是结束节点
  • 请注意,路径必须使用唯一的边才能输入B
  • 请注意,出口B没有剩余边缘
  • 因此,B不能是路径的一部分
但是,我会用稍微不同的方式来表达算法。第一次阅读步骤3b时,我被需要将长度增加1的
else
子句弄糊涂了。经过进一步的检查,我最终发现
else
子句只在算法的末尾需要。最后通过步骤3a将留下一个具有一个或两个剩余节点的图

如果两个节点保留在末端,则图形由两个阶数为1的节点和一条边组成。通过该图的最长路径的长度为1。这是一种特殊情况,移除两个端点节点只移除一条边。因此,我将重写算法,如下所示,以明确特殊情况只发生在最后

START
1. Make a list of nodes of the Tree storing the "Degree" of each node 
   along with a list of neighbors of the node. 

2. Initialize length=0

3. While the number of remaining nodes > 2
     a. remove all nodes having degree 1, and remove the corresponding edges  
     b. length+=2
     c. update the degree and the neighbor list of any remaining nodes 

4. if ( number of remaining nodes == 2 )
     length+=1

return length 
END

是的,它是有效的。OTOH你对方法#1的推理是不可靠的:“我们开始的节点X总是试图到达最长路径(比如YZ)的一部分的节点”——这个属性就是你需要证明的,以证明这种方法是正确的(而且是正确的)。@j#U random_hacker——谢谢你的确认。我已经按照你说的更新了证据。事实上,在我第一次尝试时,我正在努力画一棵树,所以我跳过了证明。现在,我有了另一个选择!请检查并确认证据案例1的有效性。案例2已跳过。方法2有名称吗?有没有使用这种方法的类似算法(不考虑最小生成树算法)。“让我们假设,如果有一条路径XT与YZ不重叠,并且长度大于XN+max(NY,NZ)”——这里的问题是,你已经假设N存在——但你还没有证明这一点,只是假设它,所以后面的矛盾只告诉你这两个假设中至少有一个是不正确的。证明应该从“假设有一条比YZ长的路径UV”开始——也就是说,不应该假设最长的路径涉及到您计算的任何顶点X、Y或Z。然后你可以把它分解成几个例子,每个例子都有一个矛盾。恐怕我不知道第二种方法的名字。为了证明它的正确性,你可以证明(很容易,通过矛盾)树中的最长路径必须以不同的叶子开始和结束,然后证明“修剪”叶子后存在的任何叶子都不能是原始树中的叶子,因此,修剪树中的任何最大长度路径都可以在原始树的每一端进行扩展。感谢您的证明和改进。
*   START -
*   Store all the nodes with their degrees.
*   1. Make a list of nodes of the Tree storing the "Degree" of each node along with the neighbors of the node. 
*
*   2.Initialize length=0;
*
*   3. While there are edges present in the tree, perform the following
*      a. remove the edges connecting all the nodes having degree 1. 
*
*      b.   if(number of edges removed >=2 ) length+=2;
*           else length+=1
*
*      c. update degree of node and its neighbors and the edge information
*
*   return length
*   END.
START
1. Make a list of nodes of the Tree storing the "Degree" of each node 
   along with a list of neighbors of the node. 

2. Initialize length=0

3. While the number of remaining nodes > 2
     a. remove all nodes having degree 1, and remove the corresponding edges  
     b. length+=2
     c. update the degree and the neighbor list of any remaining nodes 

4. if ( number of remaining nodes == 2 )
     length+=1

return length 
END