我正在解决 SCC 的两个可满足性问题,并且有一个关于拓扑排序的问题。我所基于的算法是以反向拓扑顺序处理 SCC,当它们全部连接时这很好。我的算法在这样的情况下被打破:
3 3
-2 3
1 -2
-2 -1
此图中有两个源和两个汇,并且根据您从哪里开始有多个拓扑排序,因此有两个可能的最终节点。没有循环,因此每个节点都是一个 SCC。从源到接收器有多条路径,所以当我执行反向拓扑顺序时,我可以从接收器 x3 或接收器 !x2 开始。能给我正确答案的路径是从 !x2 开始,这将导致 1、-2、-3 或 -1、-2、-3,这两者都是解决方案。但如果我从 x3 开始,一个可能的结果是 -1、2、3,这不是解决方案。
所以当我查看我的两个接收器时,我如何从拓扑上决定哪个是最后一个?显然答案是!x2,但我试图弄清楚算法将如何确定它。我看到四个可能的想法:
- !x2 是最后一个,因为它有更多的节点通向它
- !x2 是最后一个,因为它位于较长路径的末端
- 在我开始处理任何东西之前设置每个接收器的真值
- 没有办法知道哪个是最后一个,所以创建所有可能的解决方案并测试它们中的每一个,看看它是否有效。
或者有什么关于拓扑排序 SCC 的问题吗?这是基于我在早期课程中通过强连通分量作业的算法,所以它不会完全错误。