是什么?
(n) 个变量,每个变量取 0 (or) 1 表示取或不取,满足一些约束
- (a xor b = 1):(a) 和 (b) 有一个选,一个不选
- (a xor b = 0):(a) 和 (b) 要么都选,要么都不选
- (a or b = 1):(a) 或 (b) 至少选一个
- (a or b = 0):(a) 和 (b) 都不能选
- (a and b = 1):(a) 和 (b) 必须都选
- (a and b = 0):(a) 和 (b) 可以选一个或者不选
怎么做?
我们把一个点拆成两个,(x,
eg x)
考虑上面的关系,如果选 (a) 必须选 (b) 的话就从 (a) 向 (b) 连一条边
比如 (a xor b = 1),选 (a) 就必须选 (
eg b),选 (b) 就必须选 (
eg a) 所以连边 ((a,
eg b), (
eg a, b), (b,
eg a), (
eg b, a))
其他关系同理,这里列出
- (a xor b = 1):((a, eg b), ( eg a, b), (b, eg a), ( eg b, a))
- (a xor b = 0):((a, b), ( eg a, eg b))
- (a or b = 1):(( eg a, b), ( eg b, a))
- (a or b = 0):((a, eg a), (b, eg b))
- (a and b = 1):(( eg a, a), ( eg b, b))
- (a and b = 0):((a, eg b), (b, eg a))
连完边后,(tarjan) 求强联通分量,如果 (x) 和 ( eg x) 在同一个强联通分量里,则无解,否则必有至少一组解
对于 (x) 必选连边 (( eg x, x)) 和 (x) 必不选连边 ((x, eg x)) 你可能有些疑惑,接下来看了如何求解就没了
首先缩点,在同一个强连通分量里的点要选必须一起选,然后对缩完点后的 (DAG) 求一个拓扑序
考虑 (a o b) 表示 (a) 能到达 (b),也就是选 (a) 必须选 (b)
如果 (a) 和 (
eg a) 不联通,那它们随便取
如果 (a o
eg a) 选 (
eg a) 不冲突
如果 (
eg a o a) 选 (a) 不冲突
求出拓扑序后,如果 (
eg a) 在 (a) 前面则选 (a) 否则选 (
eg a),这样为什么是对的呢 ?
观察上面的边,发现他们是对偶的,如果 (a) 和 (b) 在同一个强联通分量中,那么 (
eg a) 和 (
eg b) 一定在一起
-
例题 POI 2011 Consprirary
没了