2011年10月3日
摘要: POJ_3678这是一个2-SAT的问题,很容易能够看出核心变量就是x[i],剩下的工作就是依c的值以及符号分析清楚各个x[i]之间的制约关系。#include<stdio.h>#include<string.h>#define MAXD 2010#define MAXM 4000010int first[MAXD], next[MAXM], v[MAXM], e, N, M;int dfn[MAXD], low[MAXD], cnt, ins[MAXD], s[MAXD], top;int color[MAXD], col;char oper[][5]={" 阅读全文
posted @ 2011-10-03 22:37 Staginner 阅读(217) 评论(0) 推荐(0) 编辑
摘要: POJ_3207这是一个2-SAT的问题,首先我们要找到核心的变量,我们可以观察到,只有连成的线具有要么在内、要么在外的这样的逻辑关系,因此我们可以把连成的线当做核心变量。接下来我们需要做的就是去分析,什么情况时两条线才会产生相互制约的关系。为了方便描述,我们不妨把两条线分别记作<i1,i2>(i1<i2)、<j1,j2>(j1<j2)。不难发现,当出现j1>i1&&j1<i2&&j2>i2或者i1>j1&&i1<i2&&i2>j2的情况时,两条线会相互制约, 阅读全文
posted @ 2011-10-03 20:20 Staginner 阅读(306) 评论(0) 推荐(0) 编辑
摘要: POJ_2749一开始没有想到去二分距离,看了别人的报告之后恍然大悟。这是一个2-SAT的问题,首先我们要去找到核心变量,可以看出每个牛的有着要么和S1相连,要么和S2相连的逻辑关系,因此可以把奶牛看做核心变量,并用2*i表示第i个奶牛和S1相连,用2*i+1表示和S2相连。首先,我们要喜爱和憎恨的关系转化成边。如果i和j相互憎恨,那么如果i连S1,那么j必然连S2,如果i连S2,那么j必然连S1,反过来也是一样的。于是我们需要连4条边,分别是i->~j、~i->j、j->~i、~j->i。对于喜爱的关系,同理也需要连4条边,分别是i->j、~i->~j、j 阅读全文
posted @ 2011-10-03 19:11 Staginner 阅读(448) 评论(9) 推荐(0) 编辑
摘要: POJ_2723一开始还是没有抓住2-SAT题目的核心,不会构图。其实2-SAT最重要的一点就是要找出0-1的关系,即一个东西要么选要么不选,或者要么选这个状态,要么选那个状态,这个物品就应是核心的变量。显然这个题目只有一个物品满足这一点——钥匙,对一把钥匙来讲,我们要么用它要么不用它。找到核心变量之后,剩下的工作就相对轻松了。首先,对于一对钥匙AB,我们可以得到这样的结论:如果选A,那么一定不选B,如果选B,那么一定不选A,于是就能够连两条边A->~B,B->~A。其次,对于能够开一扇门的两把锁CD,我们可以得到这样的结论:如果不用C开C锁,那么就必然要用D开D锁,如果不用D开D 阅读全文
posted @ 2011-10-03 14:13 Staginner 阅读(214) 评论(0) 推荐(0) 编辑
摘要: HDU_3715 我的第二个2-SAT的题目,^_^。整体的思路是二分深度,然后观察当前深度下是否能够推出矛盾。对于任意一个x[]只有0或1两种取值,并且只能为其中一种,为了便于分析,我们不妨设a[dep]的值为i,设b[dep]的值为j,设c[dep]的值为k,2*i这个点代表x[i]取0,2*i+1这个点代表x[i]取1。k一共有0、1、2三种取值,我们不妨分情况讨论一下x[]需要满足什么条件才可以达到下一个depth:①当k=2时,如果x[i]为1,那么x[j]必然为0,于是需要连一条有向边2*i+1->j,同理,如果x[j]为1,那么x[i]必然为0,于是需要连另一条有向边2*j 阅读全文
posted @ 2011-10-03 02:40 Staginner 阅读(329) 评论(0) 推荐(0) 编辑