Algorithm 无向加权图中连接3个顶点的最小和权,仅具有正边权

Algorithm 无向加权图中连接3个顶点的最小和权,仅具有正边权,algorithm,graph,computer-science,Algorithm,Graph,Computer Science,我正在寻找一个可以从哪里开始寻找解决这个问题的方法的指针 在谷歌搜索了一段时间后,我发现唯一一个与我的问题相似的问题是一个问题。不同之处在于,我不是在寻找一棵跨越图中所有顶点的树,而是一棵跨越3个给定顶点的树 我不是在寻找一个完整的程序,而是一个指向答案大致方向的指针 我的另一个想法是用搜索引擎运行3次搜索。其想法是通过组合不同的最短路径,以某种方式找到最佳路径。我不知道该怎么做 下面是我所说的图形类型的图形示例: 因此,我们的任务是找到一种方法,来求这类图中连接任意3个顶点的最小和权 编辑:

我正在寻找一个可以从哪里开始寻找解决这个问题的方法的指针

在谷歌搜索了一段时间后,我发现唯一一个与我的问题相似的问题是一个问题。不同之处在于,我不是在寻找一棵跨越图中所有顶点的树,而是一棵跨越3个给定顶点的树

我不是在寻找一个完整的程序,而是一个指向答案大致方向的指针

我的另一个想法是用搜索引擎运行3次搜索。其想法是通过组合不同的最短路径,以某种方式找到最佳路径。我不知道该怎么做

下面是我所说的图形类型的图形示例:

因此,我们的任务是找到一种方法,来求这类图中连接任意3个顶点的最小和权

编辑:

我用Dijkstra的算法运行了3次搜索,解决了这个问题。然后我找到了一个顶点,它有最小的和权,通过把所有的单条边加在一起,把3个顶点连接起来。谢谢你的帮助:)

我很确定你可以用Dijkstra的算法做到这一点,唯一的诀窍是你不知道访问节点的顺序,所以你必须尝试所有6种顺序

因此,如果你有节点A、B和C,对于第一个顺序A、B、C,你可以在A和B之间,在B和C之间,在C和A之间运行Dijkstra。然后你可以进行下一个顺序A、C、B,并继续从那里开始。

算法1 我认为你使用Dijkstra的想法很好

一种方法是尝试每个顶点x作为起点,并计算w(x,a)+w(x,b)+w(x,c)和的最小值,其中a,b,c是您希望连接的3个顶点,w(u,v)是使用Dijkstra计算的最短路径

我相信这个最小和将是连接3个顶点的最小和权重

不幸的是,这意味着要运行Djikstra 3.n次

算法2 更好的方法是从要连接的每个节点运行Djikstra,并将到每个节点的距离存储在图形中。(所以wa(x)是从x到a的最短距离,等等)

然后,您可以像以前一样迭代每个顶点x,并计算wa(x)+wb(x)+wc(x)之和的最小值


这相当于算法1,但比Dijkstra只运行3次快n倍。

在权重均为正且图形无向的限制下,您可以使用Dijkstra算法解决问题,正如建议的那样,假设所讨论的节点是
A
B
C
,全部在一些图形中
G

  • 从以下位置运行Dijkstra's on
    G
    • A->B
    • B->C
    • C->A
  • 它们形成连接三个顶点的三角形的边

    我们可以这样做,因为图是无向的,这意味着
    A->B
    的最短路径与
    B->A
    的最短路径相同

  • 由于权重均为正值,因此连接
    A
    B
    C
    的最短路径将精确包含两条边。(假设您乐于忽略“三角形”中三条0权重路径产生的循环的可能替代解决方案)
  • 那么我们如何选择哪两条边呢?任何两条边将连接所有三个顶点,因此我们可以消除三个顶点中的任何一个,因此我们将消除最长的一个

所以这个算法的时间复杂度和Dijkstra算法一样。

看起来像。

这个标题确实说明了一切。不,不是真的。这不是一个为我写代码的网站。请展示您尝试过的内容。“我将尽可能快地提供一个示例图形。”-难道您不能等到您说出图形后再发布问题吗?@Dukeling我在上面看到的关于图形的许多其他问题都已在不使用图像的情况下解决。我想现在发布这个问题可以证明这个问题是否容易回答或者需要我做更多的解释。有了澄清,这个问题就更容易理解了。他补充道,如果有一个例子,包括图片和解释,这个问题和大多数这些问题可能会更好一些。如果制作一个示例图像需要10分钟以上,则说明您做错了什么。如果你不愿意在一个问题(初稿)上花费至少10分钟的时间,你应该认真地重新考虑提出一个问题。请有礼貌地选择一个答案,其他人提出了与你最终得出的相同的解决方案(尽管值得注意的是,它不是最佳的,您不需要尝试每个独特的边组合,只需丢弃最长的边即可)。我认为这不适用于图a、B、C、D,其中D连接到所有权重为3的顶点,而所有其他边的权重为5。以最小的方式连接a、B、C需要使用D,总成本为9,但单个最短路径不经过D。是的,你是对的。我认为你的算法也不起作用。你的算法对边进行了双重计数在从测试节点到每个目标节点的最短路径中共享的。我认为,如果在为第二个和第三个节点运行Dijkstra时已经使用了边权重,则可以通过将边权重设置为零来使您的版本工作。可能应该添加关于负边权重的免责声明(问题没有明确指出只有正的边权重)。此外,“算法1”和“算法2”可能应该重命名为更具解释性的名称。我实际上在考虑版本1。但版本2似乎也很有趣:)我会在纸上试一下,看看结果是否正确:在尝试了你的算法之后,我发现了一个缺陷。它很重要