在加权图中找到边缘

时间:2009-07-24 20:43:24

标签: c++ algorithm data-structures graph-theory

我有一个包含四个节点的图形,每个节点代表一个位置,它们的布局就像一个二维网格。每个节点都具有与所有(根据位置)相邻节点的连接(边缘)。每个边缘也都有重量。

以下是由A,B,C,D表示的节点,边缘的权重由数字表示:

A     100     B

120         220

C     150     D

我想构建一个容器和一个算法,用于切换共享具有最高权重的边缘的节点。然后重置该边缘的重量。每次执行算法时,都不能多次切换节点(位置)。

例如,处理上述,最高权重是在边缘BD,所以我们切换那些。由于没有节点可以多次切换,因此B或D中涉及的所有边沿都会被重置。

A             D

120         

C             B

然后,下一个最高权重是在唯一的边缘左侧,切换那些将给我们最终的布局:C,D,A,B。

我目前正在执行这个非常糟糕的实现。我存储了一长串边,为它们(可能)连接的节点保存了四个值,它的权重值和节点本身的位置。每次请求任何内容时,我都会遍历整个列表。

我是用C ++编写的,STL的某些部分可以帮助加快速度吗?另外,如何避免重复数据?节点位置当前在五个对象中。存在的节点本身以及指示与其连接的四个节点。

简而言之,我需要帮助:

  • 这可以以某种方式构建,以便不存在数据重复吗?
  • 认识到这个问题?如果其中任何一个有名称,请告诉我,以便我可以谷歌获取有关该主题的更多信息。
  • 快速算法总是很好。

2 个答案:

答案 0 :(得分:2)

至于名称,这是一个顶点覆盖问题。最佳顶点覆盖是NP-hard,具有适当的近似解决方案,但您的问题更简单。您正在根据更严格的边缘选择标准查看伪最大值。具体来说,一旦选择了边缘,每个连接的边缘都被移除(表示删除要交换的顶点)。

例如,这是一种标准的贪婪方法:

  

0)对边缘进行排序;保留邻接信息
  边缘仍然存在:
  1)选择最高边缘
  2)从列表中删除所有相邻边   ENDWHILE

选择的边列表为您提供了交换的顶点 时间复杂度为O(排序顶点+顶点上的线性传递),通常会归结为O(排序顶点),这很可能是O(V * log(V))。

保留邻接信息的方法取决于图形属性;看你友好的本地算法文本。为简单起见,请尽量从邻接矩阵开始。

与邻接信息一样,大多数其他速度改进最适用于某种形状的图形,但需要权衡时间与空间复杂度。

例如,您的问题陈述似乎暗示顶点以方形图案布局,我们可以从中获得许多有趣的属性。例如,该系统非常容易并行化。此外,邻接信息将是高度规则的,但在大图形大小时稀疏(大多数顶点不会彼此连接)。这使得邻接矩阵产生高开销;你可以将邻接存储在一个4元组的数组中,因为它可以保持快速访问,但几乎完全消除了开销。

答案 1 :(得分:0)

如果您有更大的图表,请查看boost graph库。它为图形和基本迭代器提供了良好的数据结构,适用于不同类型的图遍历