图形组件之间的路径算法

时间:2013-11-24 16:54:54

标签: c++ algorithm graph

首先,这是一个家庭作业问题。我有一个布尔矩阵,其中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组。一个位于左上角,由5个节点组成,一个在右上角,由1个节点组成,另一个在下面,由2个节点组成。
  我需要做的是编写一个函数来确定必须添加到矩阵中的最少数量的节点,以便连接所有单独的组件。当可以从一个组中的任何节点到另一个组中的任何节点建立路径时,连接两个组。

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

2 个答案:

答案 0 :(得分:2)

通用问题称为the Steiner Tree problem,它是NP完全的。

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

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

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

但最佳答案的算法:NP-complete(尝试每种组合)。

答案 1 :(得分:-1)

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

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