【问题标题】:Algorithm for pathing between graph components图组件之间的路径算法
【发布时间】:2013-11-24 16:54:53
【问题描述】:

首先,这是一道作业题。我有一个布尔矩阵,其中 1 代表节点,相邻节点被认为是连接的。 例如:

1 0 0 0 1
1 1 1 0 0
1 0 0 1 1
0 0 0 0 0
0 0 0 0 0

根据我给出的定义,这个矩阵包含 3 个组。左上角1个,5个节点,右上1个1个节点,右下1个2个节点。
我需要做的是编写一个函数来确定必须添加到矩阵中的最少节点数,以便连接所有单独的组件。当可以建立从一组中的任何节点到另一组的路径时,两组连接。

所以,我要找的人在算法方面将我推向正确的方向。我已经考虑过如何使用路径查找算法来查找两组之间的最短路径,但不确定如何为矩阵中的每个组执行此操作。如果我使用深度优先遍历来确定单独的组,那么我是否可以对每个组中的任意节点到另一个节点使用路径查找算法?

【问题讨论】:

  • 似乎是一个棘手的问题!一种方法可以是首先识别这些岛,计算这些岛之间的成对最短距离,并获得 0 到 1 转换次数的上限。然后递归地尝试减少这个数字,看看它是否可能。正如我所说,这种方法效率非常低,我认为应该有更好的方法。
  • 不相交集也有利于查找单独的组。广度优先搜索擅长确定最短路径,因为您“向外辐射”很慢。我同意@AbhishekBansal 这是一个棘手的问题

标签: c++ algorithm graph


【解决方案1】:

通用问题称为the Steiner Tree problem,它是NP-complete。

有一种算法不是指数的,但会给你一个次优的解决方案。

您可以这样做的方法是计算任意两对组件之间的最短路径,仅使用初始组件和您计算的权重做最小生成树,然后通过您的解决方案并消除循环。

由于您有很多连接岛屿的选项,我会添加一个步骤来优化连接。

但有一个算法可以得到最佳答案:NP-complete(尝试所有组合)。

【讨论】:

  • 您可以使用 Steiner 树求解器解决此问题,但这并不意味着它一定是 NP 难的。要显示 NP 硬度,您必须证明您可以将施泰纳树问题简化为这个问题,而不是相反。
  • 我一开始就说过泛型问题是 NP 难题。我也不知道如何使用额外的约束来优化解决方案。从理论的角度来看,你是对的。从实际角度来看,您可以实施 NP 解决方案并使其发挥作用。
  • 这不是直线施泰纳树问题,也是 NP 难的吗?
【解决方案2】:

将每个连接的组件(组)视为一个节点。然后您可以运行 MST(最小生成树)算法来找到连接所有组的最小成本。

复杂性:构建边的复杂性 = O(M*M) + O(ElgV)(M 是给定网格上 1 的数量,M*M 操作来找到曼哈顿距离,每对 1 都可以找到每对组的曼哈顿距离)和O(ElgV)是求MST的复杂度

【讨论】:

  • 您计算 MST 的图中的节点和边是什么?即使不使用中间节点,MST 也不会连接它们吗?
  • @templatetypedef: first: 将每个连接的组件(组)视为一个节点。 second:M 是给定网格上 1 的数量和 M*M 操作查找每对 1 的曼哈顿距离 查找每对组的曼哈顿距离 在考虑您问题中的中间节点时,我明白,MST 在这里不起作用:) 将更新 ans。谢谢
  • 看了你们提到的一些事情后,我认为这是最好的方法。由于我只需要输出连接所有组件所需的节点数,因此可以计算每个组件最近节点之间的曼哈顿距离,然后从一个组件到其他所有组件的最短距离。感谢您的意见,伙计们。
  • 也许我遗漏了一些东西,但是 MST 信息如何告诉您要点亮哪些方块?可能有许多相同长度的不同路由连接所有集群,但有些可能比其他路由更好,因为您可以在它们之间共享 1。此外,为什么最优结构必须是 MST?也许最好的选择引入一些中间连接点。想一想 T 形的三个集群。将它们加入 T 可能比加入两个独立的对更好。
猜你喜欢
  • 2015-08-29
  • 2017-08-10
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2010-12-03
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多