查找并连接子图

时间:2011-10-10 12:49:52

标签: algorithm language-agnostic graph-theory

我有一个简单的Node结构(存储X和Y位置,以及链接到它的节点列表),并有一个Node结构列表。

当生成节点时,每个节点将具有最多3个最近节点的边缘(按距离,边缘的数量从1到3是随机的)。我最终得到了许多子图,我需要将它们连接起来形成一个图形。

  1. 如何找到子图?

  2. 一旦找到了子图,我希望将它们连接在一起形成一个连通图。我可以随机选择一个子图,并选择最接近它的子图并加入它们。然后我将再次重复步骤1到2,直到没有子图。我如何a)找到最近的子图,b)决定加入哪两个节点,使得边缘最小?

  3. 每个节点可能有多个边缘。

    PS。我正在生成一个星形图,其中有'虫洞'链接它们。因此边缘是双向的。实施在C#

1 个答案:

答案 0 :(得分:1)

根据我的理解,你的图形应该由靠近在一起的点集合组成(你认为它们是使用短/廉价边缘相互连接的节点),但是集群本身相距甚远(可能是几个相对于集群内各点之间距离的数量级。)

您想创建一个连接图,以便使用的边是最便宜的。

以这样的方式连接的图表,其中边缘的总成本是最小的实际上是Minimum Spanning Tree.有几种算法可以让您从图表中找到这样的树,我建议{ {3}}用于您的用例。

Kruskal的算法基本上可以通过获取所有边的列表(在您的情况下所有n *(n-1)/ 2个节点之间的可能连接),按非降序排列列表并从最便宜到最多昂贵的边缘。最初,您只需要一个只有所有节点且没有边缘的空图形 - 因此它由每个单个节点的n个断开连接的组件组成。每次处理边时,查看添加边是否在图中创建了一个循环。如果它没有将其添加到您的图表,否则跳过它。继续,直到处理完整个列表。要检查添加边是否会导致循环,您可以使用Kruskal's Algorithm(如Lucasus建议的那样)。

Kruskal也可用于仅查找群集,如果这是你感兴趣的东西。当你到达一个太贵而无法在附近节点之间的边缘时停止构建树。您将获得由断开连接的组件组成的图形,每个组件代表由靠近的节点组成的集群。贵的东西是多贵的,你必须要决定。