【问题标题】:Minimum spanning trees on two graphs with some common edges具有一些共同边的两个图上的最小生成树
【发布时间】:2015-03-25 22:39:22
【问题描述】:

给定两个带有加权边的完整图,我想分别在两个图上找到两个最小生成树 (MST),条件是两个学习的 MST 在给定的边子集上具有公共边。请注意,这两个图的顶点数相同,但边的权重都不同。

例如,如果两个图是具有顶点 {1,...,d} 的完整边加权图。我们要求两个学习的 MST 在顶点为 {1,...,d/2} 的完整子图上具有相同的边。

我可以使用什么算法来查找此类 MST?我尝试使用对 Kruskal 算法的修改,但无法使其工作。

【问题讨论】:

  • 你能告诉我们你使用的代码吗?
  • 输入是{1,...,d}中任意顶点i,j的权重w(i_k,j_k),k=1,2表示两个图。要求两个 MST 在顶点 {1,...,d/2} 上的完整子图上具有相同的边。我不确定哪种算法会起作用。我目前的想法是将 Kruskal 算法应用于 {1,...,d/2} 中 i,j 和 w(i_k,j_k) 的权重 \sum_{k=1}^2 w(i_k,j_k)对于 i>d/2 或 j>d/2。但也存在这种算法不能保证最优解的情况。
  • 你能举个完整的例子吗?
  • 我知道如何查找是否存在与一组边上的第一个 MST 匹配的第二个 MST,您可能有很多不同的 MST,它们在感兴趣的子图。这有一种 NP-complete 的感觉。

标签: algorithm graph tree minimum-spanning-tree undirected-graph


【解决方案1】:

不确定我是否遇到了问题,因为描述缺少一些重要的细节。
无论如何,这是一种可能的方法,在给定的约束条件下可以应用。

只要两个图具有相同数量的边,并且您可以将这些图表示为边列表,则可以使用 MRT 算法找到它们所有的公共生成树。
它通常被称为Two Graphs Common Spanning Trees Algorithm,在 Mint、Read 和 Tarjan 的一篇学术文章中有描述。
请注意,Boost Graph Library 已经包含proper implementation

找到这些树后,您可以对其进行迭代以删除那些不是其各自图表的最小生成树的树。请注意,如果您删除第一个图的 i-th 通用生成树,您也应该删除第二个图的 i-th 树。
之后,如果集合不为空,您可以删除所有那些不包含属于您的问题的给定边子集的树(我不完全理解您的意思是说边是共同的到两个图,但如果它是一个约束,你可以在结果集上强制它)。
剩下的树就是你要找的树。

如果两个图的边数不同,您可以将假节点和边添加到较小的那个。
换句话说,创建一个假节点 nf-i 并添加一条边 nf-i -> n-i,其中 n-i 是一个真实节点。给边缘一个零权重。
在该过程结束时,您可以轻松移除这些节点和边并取回原始生成树。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多