[算法] 2-SAT简记

真的是

2-SAT

$ 2-SAT $ 用于求解一个变量只有两种情况的适应性问题(就是有没有解以及输出一种方案);

其实可以类比二分图最大匹配(但其实两者的差别还是很大的);

算法流程

对于每一个变量,我们都有两种情况,$ true $ 和 $ false $;

而题目中给我们的,是形如 {$ A = true / false $ 或 $ B = true / false $} 的若干个二元组,问是否能够全部满足;

如题:Luogu P4782 【模板】2-SAT

考虑对于{$ A = p $ 或 $ B = q $}, 我们可以有如下的伪代码:

if (A == p) B 可以为 q 或 !q
if (A == !p) B 只能为 q
if (B == q) A 可以为 p 或 !p
if (B == !q) A 只能为 p

我们不难发现,对于第二种和第四种情况,我们是可以确定 $ A $ 和 $ B $ 的;

因此,我们可以依据这个性质,进行加边操作:

$ A_p \rightarrow B_q $ 这条边代表当 $ A $ 为 $ p $ 时,$ B $ 只能为 $ q $;

这样建好图后,我们要判断无解;

引理1: 若 $ A_p $ 与 $ A_{!p} $ 在同一强联通分量中,即无解;

显然;

求法:$ Tarjan $;
对于有解的情况,题目要求输出一种方案,有以下引理:

引理2: 对于$ A $ 的两种情况 $ A_p $ 与 $ A_{!p} $,若选择两者拓扑序较大的( $ Tarjan $ 遍历顺序较小的)作为答案,则一定可以满足要求;

这里的“满足要求”指的是满足要求的多种情况中的一种情况;

其实稍微思考一下,不难发现拓扑序较大的节点需要满足的条件较少,所以更容易满足要求;

至于证明,我来浅浅的证明一下:

证:

考虑采用反证法;

设 $ f( A_p ) $ 表示缩点后 $ A_p $ 所在强连通分量的拓扑序;

设有:

\[f(A_p) < f(A_{!p}) \ \ \ \ \ \ \ \ \ \\ \ \ \\ \ \ \ (1) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f(B_{!q}) < f(B_q) \ \ \ \ \ \ \ \ \ \\ \ \ \\ \ \ \ (2) \]

且存在单向边:

\[ X = (B_q \rightarrow A_p) \]

由题意,我们可以得知有一条单向边:

\[Y = (A_{!p} \rightarrow B_{!q}) \]

此时我们可以发现,原来的二元组为:{$ A_p $ 或 $ B_{!q} $}

所以此时的合法方案有:

$ A = p, B = !q $;

$ A = p, B = q $;

$ A = !p, B = !q $;

三种;

不难发现,这三种情况涵盖了选出的两个变量的拓扑序都是小的和一大一小两种情况,唯独没有两个都是大的这种情况;

由 $ X $,易得:

\[f(A_p) > f(B_q) \ \ \ \ \ \ \ \ \ \\ \ \ \\ \ \ \ (3) \]

由 $ Y $,易得:

\[f(A_{!p} < B_{!q}) \ \ \ \ \ \ \ \ \ \\ \ \ \\ \ \ \ (4) \]

联立 $ (1) (3) (4) $,得:

\[ f(B_{!q}) > f(B_q) \]

与 $ (2) $ 矛盾,所以可以得出,在这种情况下,选出的两个变量的拓扑序都是小的和一大一小两种情况不合法(最极限的情况),而我们又可以判断出题目中所给出的情况有解,所以选择两者拓扑序较大的一定可以满足要求;

引理2得证;

证毕;

Luogu P5782 [POI2001] 和平委员会

把每个人的搭档看做其反面即可;

最后判断一下搭档是否在同一个强连通分量里即可;

输出方案和上一题相同;

posted @ 2024-08-12 14:27  Peppa_Even_Pig  阅读(35)  评论(1)    收藏  举报