【问题标题】:Finding edge in weighted graph在加权图中寻找边
【发布时间】:2009-07-24 20:43:23
【问题描述】:

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

这里是用 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 的某些部分可以帮助加快速度吗?还有,如何避免数据重复?一个节点位置当前在五个对象中。存在的节点本身和指示与它的连接的四个节点。

简而言之,我需要以下帮助:

  • 能否以不重复数据的方式进行结构化?
  • 发现问题了吗?如果其中任何一个有名称,请告诉我,以便我可以通过 Google 搜索有关该主题的更多信息。
  • 快速算法总是不错的。

【问题讨论】:

  • 假设边只在网格位置之间正交连接并且网格本身是正方形的,边的数量可以由2n(n+1)给出,其中n=sizex-1=sizey-1 ...如果有帮助的话。来源:research.att.com/~njas/sequences/A046092

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


【解决方案1】:

至于名称,这是一个顶点覆盖问题。最佳顶点覆盖是 NP 难的,具有不错的近似解决方案,但您的问题更简单。您正在查看更严格的边缘选择标准下的伪最大值。具体来说,一旦选择了一条边,就会删除所有连接的边(表示要交换的顶点的删除)。

例如,这是一个标准的贪心方法:

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

所选边的列表为您提供要交换的顶点。
时间复杂度为 O(排序顶点 + 线性遍历顶点),通常归结为 O(排序顶点),可能为 O(V*log(V))。

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

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

例如,您的问题陈述似乎暗示顶点以正方形图案布置,我们可以从中得出许多有趣的属性。例如,该系统很容易并行化。此外,邻接信息将是高度规则的,但在大图尺寸下是稀疏的(大多数顶点不会相互连接)。这使得邻接矩阵的开销很高;您可以改为将邻接存储在 4 元组数组中,因为它可以保持快速访问但几乎完全消除开销。

【讨论】:

  • “边缘着色为每条边缘分配一种颜色,因此没有两个相邻的边缘共享相同的颜色”(en.wikipedia.org/wiki/Graph_coloring)。在我看来,我只对两种“颜色”感兴趣,处理和未处理。 “相邻边不共享颜色”问题应该如何考虑?
  • 啊,你是对的,我模糊的记忆抓住了错误的术语。我会更正帖子。正如您正确指出的那样,我正在考虑标记完成部分的“着色”操作-您只关心可用和不可用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多