匹配节点的图形算法

时间:2010-12-14 21:44:13

标签: java algorithm graph matching graph-algorithm

给定一个有向图,我可以用什么算法找到其边缘的随机子集,以便每个节点只有一个传入和一个传出边?

例如,这可能是我给出的图表:

Starting input graph

这将是一个有效的输出图:

A valid output graph

这是有效的,因为:

  • 它包含输入图上的所有节点
  • 它的所有边缘也在输入图上
  • 每个节点只有一个边缘离开它,一个边缘到达它(并且不能是相同的边缘,不允许循环,每个节点必须连接到至少一个其他节点)。

如果没有可能的解决方案应该被检测到。

是否有一种有效的算法来解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:5)

这是节点周期覆盖问题。它可以解决为Maximum matchings in bipartite graphs

简而言之:

  1. 将每个节点分成两个,每个节点位于图形的一个分区中,以便所有边缘从分区P1到分区P2。在您的示例中,节点A和D将变为分区P1中的节点A1,D1和P2中的A2,D2。边缘A-D将变为A1-D2,而D-A变为D1-A2。
  2. 然后找到最大匹配,存在一些算法。
  3. 然后合并节点,你就有了一个循环覆盖。

答案 1 :(得分:0)

您正在尝试将图表分解为一组周期。

This link指向Tarjan的算法,用于在图表中查找周期。

之后,您将需要一些搜索策略(根据您的约束,某些周期选择可能无法找到解决方案)。