2可满足性强连通分量拓扑排序

时间:2017-04-02 01:56:28

标签: algorithm graph-algorithm 2-satisfiability

我正在解决SCC的两个可满足性问题,并且对拓扑排序有疑问。我所基于的算法是以反向拓扑顺序处理SCC,当它们全部连接时很好。我的算法打破了这样的情况:

3 3
-2 3
1 -2
-2 -1

这使得图形看起来像这样: Graph of problem

此图中有两个源和两个接收器,根据您的起点,有多个拓扑排序,因此有两个可能的最终节点。没有周期,因此每个节点都是SCC。从源到接收器有多条路径,所以当我反向拓扑顺序时,我可以从接收器x3或接收器开始!x2。给出正确答案的路径是从!x2开始,这将导致1,-2,-3或-1,-2,-3,这两个都是解决方案。但是如果我从x3开始,一个可能的结果是-1,2,3,这不是解决方案。

所以,当我看到我的两个水槽时,我如何在拓扑上决定哪个是最后一个?显然答案是!x2,但我想弄清楚算法将如何确定。我看到了四个可能的想法:

  • !x2是最后一个,因为它有更多节点通向它
  • !x2是最后一个,因为它位于较长路径的末尾
  • 在开始处理任何内容之前设置每个接收器的真值
  • 无法知道哪个是最后一个,因此请创建所有可能的解决方案并测试每个解决方案以确定其是否有效。

或者有什么关于拓扑排序的SCC,我没有到这里?这基于我在之前的课程中用于传递强连接组件分配的算法,因此它不能完全错误。

1 个答案:

答案 0 :(得分:1)

如果没有看到您的代码,我无法确定,但我的猜测是,当您处理文字时,您需要设置一个值,然后在您在拓扑顺序中更深入地忽略它时再翻转它。关键是,一旦设置了变量,就不能再次更改它。略过已有设定值的任何变量的文字。

编辑添加:从您的评论我认为我看到了问题。你提到当!x2在反向拓扑排序中排在第一位时,将变量x2设置为true。您应该将 literal !x2设置为true,这意味着您将变量 x2设置为false。如果你这样做,那么你的求解器应该与你开始使用哪个接收器无关。