2-sat用于解决这样一类问题:给出n个二元组,每个二元组必选出一个元素,而这些元素间可能有互斥的情况,要求给出合理方案。我们可以知道,对于二元组,如果因为被排斥而不选择某个元素,那么意味着必定选择另一个,这就使得问题可解,3-sat及以上似乎没有多项式算法……?
tarjan方法
利用tarjan算法求出每个点所属scc,如果二元组两个点位于同一个scc中则无解。输出方案时,输出两点中scc编号较小的一个即可,因为它处在这个dag的下游。上游点则会达到下游的点。
例题cf780d:n个俱乐部,两种选缩写方案,一种是俱乐部名字前三个字母,另一种是俱乐部名字前两个字母+城市首字母。
要求缩写不能有重复,且如果有俱乐部选择了方式2,那么不得有名字前三位相同的俱乐部采用方式1。求一种合法取名方案。
思路:每个俱乐部两种方案且各个方案间有互斥关系,故用2-sat解决,用这2n种方案建图,并根据规则连上对应的边。
1 |
|
暴搜方法
思想类似,搜索某个点就意味着要选择某个点,那么搜进去第一步检查一下相对点是否被选择就可以了,如果选择了就直接返回false