算法介绍
如果有多个布尔变量,必须满足一些限制条件(如某两数或值为 t r u e \rm true true),那么求这些变量的问题就叫做 2-SAT
问题,在 O I \rm OI OI 中通常转化为图论问题求解。
算法流程
为了方便表述,下面我们将 t r u e \rm true true 看做 1 1 1, f a l s e \rm false false 看做 0 0 0。
首先我们考虑对每一个变量 i i i 建两个点 i , i ′ i,i' i,i′,分别代表这个变量取 0 / 1 0/1 0/1,且我们称代表同一变量的两点互为 “对应点”。
然后对每个点我们需要确定一个权值,也只能为 0 0 0 或 1 1 1,分别代表其对应变量取值与其 不符 / 相符。例如当 i i i 号点取 1 1 1 时,变量 i i i 的值就应当为 0 0 0,显然任何一对对应点不能同时取 1 1 1,也不能同时取 0 0 0。我们的目标就是要确定一个这 2 n 2n 2n 个点的权值方案使其对应的变量取值方案合法。
我们通过连边来满足限制条件,令 i i i 号点连向 j j j 号点的边代表当 i i i 号点值取 1 1 1 时 j j j 号点值也要取 1 1 1,那么就可以根据不同的限制条件连出不同的边。例如当条件为 "变量 i i i 与变量 j j j 异或值为 1 1 1" 时,我们就应该将 i i i 与 j ′ j' j′ 连边、 i ′ i' i′ 与 j j j 连边。
特别的,当条件中 i i i 等于 j j j 或者直接指定某变量的值时,我们可以同样连边,无需特判。例如当条件为 i = 1 i=1 i=1 时,就直接将 i ′ i' i′ 与 i i i 连边;当条件为 "变量 i i i 与变量 i i i 相与得 0 0 0"时&#x