2SAT的一点理解

首先大概说一下2sat的步骤

1.用tarjan求出强联通分量,这一步是因为如:1-->2 ,  2-->3, 3-->1这么三组关系,(i-->j代表的意思是选择了i,则必须也要选择j),这样三组关系就是强联通分量,也意味着选择了其中一个数字,其他的数字也将必须被选择。

2.判断一个强连通分量中有没有两个选项都有,比如1和1'都出现在一个全连通分量中,那肯定无解,因为1和1'必须只能选一个,而他们在一个强联通分量中的后果是要么都选,要么都不选。如果没有这种情况出现,那么必定有解。

3.进行解的求取。对前面的强连通分量重新构逆图,然后进行拓扑排序,两个分量中,现在拓扑排序中输出的那个就应该选入解。为什么呢?因为i-->j代表的意思是选择了i,则必须也要选择j,如果不把边取反,变成i<--j才会出问题。因为j是可以随意取的,他的自由度高于i.随意要先从自由度高的开始进行选择。选择了j,那么i就肯定可以选了,所以deg[i]--,直到i所需要满足的条件点全部凑齐后,i才可以入栈,即选择。如果先出现一个点选了,而他的相反点还没有被选过。那不管了,反正选这个点肯定是解的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值