2-sat 速通
如题,这是一个只适合快速了解的文章,如果要学习 2-sat 那么请阅读其他文章。
求解的问题
给定一些要求,对于每一个要求必须满足其中一个,判断是否有解,如果有输出任意一组。
操作
定义 \(a'\) 为 \(a\) 不满足,那么如果要求为 \(a,b\) 则 \(a\to b+n\),\(b\to a+n\)。
接下来跑 tarjan 缩点,如果 \(a,a+n\) 在同一个强连通分量中则无解,否则根据缩点后的编号决定选择。
如果 \(col_{a}\lt col_{a+n}\),那么选择 \(a\) 否则选择 \(b\),时间复杂度为 \(O(n+m)\)。