Algorithm 验证无向树中最长路径的不同方法
我在尝试这个问题- 在未加权的无向树上寻找最长的路径 方法1 简单直观的解释- 我们从节点X开始,它总是试图到达作为最长路径(比如YZ)一部分的节点。因此,通过最长路径(例如在节点N处)。从那以后,它将有两个选择——要么在最长路径的一侧(新西兰)走,要么在另一侧(纽约)走。这将需要更长的时间(纽约和YZ)。因此,我们最终将到达最长路径(节点Y)的一端。现在,如果X选择的路径不是与最长路径(YZ)重叠的路径(max(NY,NZ)),那么概括地说,这意味着存在一条比最长路径(YZ)更长的路径 用矛盾证明- 案例1-Algorithm 验证无向树中最长路径的不同方法,algorithm,path,tree,Algorithm,Path,Tree,我在尝试这个问题- 在未加权的无向树上寻找最长的路径 方法1 简单直观的解释- 我们从节点X开始,它总是试图到达作为最长路径(比如YZ)一部分的节点。因此,通过最长路径(例如在节点N处)。从那以后,它将有两个选择——要么在最长路径的一侧(新西兰)走,要么在另一侧(纽约)走。这将需要更长的时间(纽约和YZ)。因此,我们最终将到达最长路径(节点Y)的一端。现在,如果X选择的路径不是与最长路径(YZ)重叠的路径(max(NY,NZ)),那么概括地说,这意味着存在一条比最长路径(YZ)更长的路径 用矛盾
假设有一条路径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的节点B是路径的一部分,但不是结束节点
- 请注意,路径必须使用唯一的边才能输入B
- 请注意,出口B没有剩余边缘
- 因此,B不能是路径的一部分
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