「Algorithm」2-SAT
Posted at 19-3-10 21:24, Updated at 19-10-16 21:59
一个比较简单的图论问题,总算是填了这个小坑
Problem
有一些集合,每个集合中有且仅有两个元素,且不能同时选取两个元素,集合间的元素存在一定的选择关系,求解可行性及可行方案
Algorithm
其实这也不算是一个算法,就是一个很简单的图论模型,特别详细的过程可以看这里
把每个点拆成两种状态和,状态之间互相连形如如果选a则必须选b
的有向边,通过tarjan
求强连通分量来判断可行性
算法流程如下:
连边
跑tarjan
判可行性:判断一个点的两种状态是否同属一个强连通分量
输出方案:输出两种状态中较先被缩成强连通分量的那个状态即可
这个本质是对强连通分量进行缩点,缩完后形成的树(或者说是
DAG
也行)上显然如果状态被选,那么的子树的所有状态都要选。于是对于同一个点的两种状态而言,肯定只能选深度较深的那种状态,这种状态显然在用tarjan
缩点时会先被缩起来
Connection
关于连边,主要思想就一个:选了a必选b
对应连边和(逆否命题,必须也要连),然后根据相应的逻辑关系进行连边
常见的逻辑关系有:
- 、不能同时选:选了就要选,选了就要选
- 、至少选一个:选了就要选,选了就要选
- 、必须同时选:选了就要选,选了就要选,选了就要选,选了就要选
- 、必须选一个:选了就要选,选了就要选,选了就要选,选了就要选
- 必须选:
- 必须不选:
Example
懒的放了