给定两个带加权边的完整图,我想在两个图上分别找到两个最小生成树(MST),条件是两个学习的MST在给定的边缘子集上有共同边。请注意,两个图形具有相同数量的顶点,但边缘权重都不同。
例如,如果两个图是具有顶点{1,...,d}的完整边加权图。我们要求两个学习的MST在具有顶点{1,...,d / 2}的完整子图上具有相同的边。
我可以使用什么算法来查找此类MST?我尝试使用Kruskal算法的修改,但无法使其工作。
答案 0 :(得分:0)
我不确定是否遇到问题,因为说明中缺少一些重要细节 无论如何,这是一种可能的方法,它具有给定的约束条件,可以适用。
只要两个图形具有相同的边数并且您可以将这些图形表示为边缘列表,就可以使用MRT算法查找所有常见的生成树。
它通常被称为 Two Graphs Common Spanning Trees Algorithm ,它在Mint,Read和Tarjan的学术文章中有描述。
请注意,Boost图库已包含proper implementation。
找到这些树之后,您可以迭代它们以删除那些不是各自图形的最小生成树的树。请注意,如果您删除第一个图形的 i-th 公共生成树,则还应删除第二个图形的 i-th 树。 之后,如果集合不为空,您可以删除所有那些不包含作为问题一部分的给定边缘子集的树(我没有完全理解你的意思是说edge是两个图的共同点,但如果它是一个约束,你可以在结果集上强制执行它 剩下的树木就是你要找的树。
如果两个图形具有相同数量的边缘,则可以将较小的节点和边缘添加到较小的边缘。
换句话说,创建假节点 nf-i 并添加边 nf-i - > n-i ,其中 n-i 是一个真实节点。给边缘一个零重量
在该过程结束时,您可以轻松删除这些节点和边缘,并返回原始生成树。