C++ 在加权图中寻找边

C++ 在加权图中寻找边,c++,algorithm,data-structures,graph-theory,C++,Algorithm,Data Structures,Graph Theory,我有一个有四个节点的图,每个节点代表一个位置,它们像二维网格一样排列。每个节点都有一个到所有(根据位置)相邻节点的连接(边)。每一条边都有重量 以下是由A、B、C、D表示的节点,边的权重由数字表示: A 100 B 120 220 C 150 D 我想构造一个容器和一个算法,用于切换共享具有最高权重的边的节点。然后重置该边的权重。每次执行算法时,不能多次切换节点(位置) 例如,在处理上述内容时,最高权重在边缘BD上,因此我们切换它们。由于没有

我有一个有四个节点的图,每个节点代表一个位置,它们像二维网格一样排列。每个节点都有一个到所有(根据位置)相邻节点的连接(边)。每一条边都有重量

以下是由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的一些部分能帮助加速吗?另外,如何避免数据重复?节点位置当前位于五个对象中。存在的节点本身以及指示与其连接的四个节点

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

  • 这种结构是否可以避免数据重复
  • 认识到这个问题了吗?如果其中任何一个有名字,告诉我,这样我就可以在谷歌上搜索更多关于这个主题的信息
  • 快速算法总是好的

如果您有较大的图形,请查看库。它为图形提供了良好的数据结构,为不同类型的图形遍历提供了基本迭代器。至于名称,这是一个顶点覆盖问题。最佳顶点覆盖是NP难的,具有适当的近似解,但您的问题更简单。在更严格的边选择标准下,您将看到一个伪最大值。具体地说,一旦选择了一条边,每个连接的边都将被删除(表示要交换的顶点的删除)

例如,这里有一个标准的贪婪方法:

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

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

保留邻接信息的方法取决于图的性质;查看友好的本地算法文本。为了简单起见,可以从邻接矩阵开始

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


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

假设边仅在网格位置之间正交连接,并且网格本身是正方形,则边的数量可以由2n(n+1)给出,其中n=sizex-1=sizey-1。。。如果有帮助的话。来源:“边着色为每条边指定一种颜色,以便相邻的两条边不共享相同的颜色”()。在我看来,我只对两种“颜色”感兴趣,有处理的和没有处理的。“相邻边缘不共享颜色”的问题应该以何种方式考虑?啊,你是对的,我模糊的记忆抓住了错误的术语。我会更正邮件的。我在考虑“着色”的操作,即标记完成的部分,正如您正确指出的那样——您只关心可用和不可用的部分。