平面上n个点用n条线段相连相连,求最短路径

平面上有n个点,将这n个点用n条线段相连(就是用n条边连接n个点,每个点仅与另外两个点相连),从任一点出发可以走遍所有点并回到起始点,求出这n条边的长度和的最小值。
我想了个贪心:从n个点中任取3个点形成一个三元环,然后每次加一个,加的方法是从原来的环中选择一条边断开,把新的点加进去,形成一个新的环,保证这个环的周长最短
问题是这个新的点只能插入原环中相邻的两个点中,如果与非相邻边相连需要将点重新排列
我试了几组数据都是正确的
我希望得到如下的回答之一:
(1)一个新的方法(不要遍历穷举和图搜索)
(2)证明我的贪心策略是正确的(证明是错的也行)
能同时给(1)和(2)就更好了
谢谢了_(:3 ⌒゙)_

@ada; 请来看看如何解决。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7457114
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    算法思想

  • 以下回答来自chatgpt:

    问题标题: 寻找连接n个点的最短路径 问题内容: 在平面上有n个点,你需要将这n个点用n条线段连接起来,使得从任一点出发可以经过所有点并回到起始点。求出这n条边的长度和的最小值。

    (1) 新的解决方法(请不要使用遍历穷举和图搜索):

    我将提供一种解决方案,该解决方案基于最小生成树(Minimum Spanning Tree)的概念。最小生成树是一个连通图的生成树,其中边的权重之和最小。在我们的问题中,我们需要将n个点连接起来,并且希望最小化边的长度之和。

    我们可以使用Prim算法或Kruskal算法来构建最小生成树。这两种算法的时间复杂度都为O(E log V),其中E是图中边的数量,V是图中顶点的数量。

    以下是基于Prim算法的解决方案的伪代码:

    1. 创建一个空的最小堆minHeap和一个空的集合visited。
    2. 将起始点加入visited集合。
    3. 从起始点开始,将所有与起始点相连的边加入minHeap。
    4. 当minHeap不为空时,重复以下步骤:
      • 取出minHeap中权重最小的边edge。
      • 如果边的目标点不在visited集合中:
        • 将边edge加入最小生成树中。
        • 将目标点加入visited集合。
        • 将与目标点相连的边加入minHeap。
    5. 输出最小生成树的边的长度之和。

    这个解决方案的思路是通过贪心的策略逐步选择最小的边来构建最小生成树。最终,最小生成树的边的长度之和就是连接n个点的最短路径的长度。

    (2) 证明我的贪心策略是正确的(若贪心策略是错误的也请证明):

    对于寻找连接n个点的最短路径的问题,使用贪心策略可以得到最优解的证明并不明显。这是因为贪心策略通常不保证得到全局最优解。在某些情况下,贪心策略可能会导致次优或错误的结果。

    在本问题中,你提出的贪心策略是从n个点中任意选择3个点形成一个三元环,然后每次加入一个新的点,加入的方式是从原来的环中选择一条边断开,将新的点插入两个相邻的点之间,形成一个新的环。这样可以保证新的环的周长最短。

    要证明这个贪心策略的正确性,需要考虑两个方面:

    1. 子问题的最优性:对于任意的3个点形成的三元环,插入一个新点后形成的新环的周长一定是最短的。这可以通过简单的几何推理来证明,在这里就不再详述。

    2. 子问题的最优解的组合为全局最优解:将形成的所有子问题的最优解组合在一起,可以得到连接n个点的最短路径的最优解。这可以通过反证法来证明,假设存在一个更优的解,其中某些子问题的解不是最优的,那么可以通过将这些子问题的解替换为最优解,得到一个更优的解。这与已知的最优解相矛盾,因此假设是错误的,贪心策略的解是最优的。

    综上所述,贪心策略在这个问题中是正确的。然而,这只是一种可能的解决方案,还可以有其他算法和策略来解决这个问题。如有需要,可以进一步研究和探索其他方法。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^