2-SAT阶段性学习小记

来源:互联网 发布:中国体育彩票关注软件 编辑:程序博客网 时间:2024/05/21 06:13

概念

SAT就是Satisfiability,适定性,即是否有满足所有条件的情况。一般来说2-SAT问题就是:给定一堆集合,大小为2,每个集合必须且最多取一个,不同集合间的不同元素有一些约束条件,通常表现为and、or、xor、not等形式,通过进行构图,跑2-SAT算法解决。

算法

从题目入手

题目大意:一国有n个党派,每个党派在议会中都有2个代表,现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会。已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委员会的成员,现要你判断满足要求的和平委员会能否创立?如果能,请任意给出一种方案。( POI 0106 )

首先想一个朴素的东西:
设一个党派的两个代表为A,B,那么如果1A跟2A有仇,那么如果选1A的话,就只能选2B了。我们给1A向2B连一条边,那么我们暴力的时候,选了点i则要把能走到的其他点全部选掉,假如走回了i,却是不同的代表,则不合法,例如从1A走回1B。
然后有得标记就标记,如果A不行就试B,两个都不行就无解(之后解释)。
时间复杂度O(NM),m边数,n点数。当然了,这个暴力并非一无是处:可以求字典序最小(大)的方案。

中间插入一段话:1A向2B连一条边,表示选1A必选2B,等价于给2A向1B连一条边,代表

先给出只能判断有无解的高速算法,之后解释 :

缩点

连边后tarjan对强联通分量缩点;把所有边反向。

判断可行

如果相同党派的两个代表处于相同分量,则不可行,否则可行。
接下来是找一种合法方案。

找矛盾分量

对于一个分量x,有且只有一个矛盾分量ant[x],满足:一对A,B分别出现在两个分量中。

拓扑排序

强连通分量已经缩成点,排序!

构造方案

按拓扑序访问点,如果没有选就选他,
选了x,ant[x]就不能选,并且ant[x]和它能走到的所有分量都要打上“不选”的标记。
没了。

解释

有时间再写···

0 0
原创粉丝点击