2-SAT
2021-05-16
2 min read
一、简介
简单来说,就是有 个布尔变量 ,有 个条件,每个条件都形如“ 为真 假或者 为真 假”(“或者”指至少满足其中一个条件)。问是否有一种 的取值满足上面所有条件。
二、解法
将每个布尔变量看作两个点,然后根据条件建边。对于每一个条件“ 为真 假或者 为真 假“,点 表示 取真,点 表示 取假, 同理。若有条件 为真或者 为假“,则连一条 向 ,表示若 取假则 一定要取假(因为 取假的话只有 取假才能满足该条件),同理连 向 的边。
显然在一个环中若选了一个点,则整个环都要选,因此我们考虑 tarjan 缩点。至于判断是否存在方案,我们发现若 和 在同一个强连通分量中,则不存在,否则的话存在。
然后是输出方案的问题。因为 表示选了 一定选 ,而缩点后图是 DAG,满足拓扑序。因此对于每一个 判断它的两个点 和 谁的拓扑序更大就选谁,另外一个直接舍去。而 tarjan 后的强连通分量编号和拓扑序相反,选编号小的点。
三、例题
模板题。
模板题。不过注意字符串读入,编号可能不止一位!
看到求满足条件的最小值就想到二分,但如何判断时间是否合法呢?因为每架飞机有两种可能,因此想到 2-SAT,枚举若相隔时间小于最小值,则连另一个的边。
发现每个场最多放两种车,直接 2-SAT,不过有些细节比较麻烦。