由于某个养牛场只能连S1或S2,想到2-SAT,又由于是求最小的最大值,可以二分答案
二分构图时,先把相互讨厌和相互喜欢的加边,然后对每组i和j,X表示到S1的距离,Y表示到S2的距离,i表示与S1相连,~i表示与S2相连,dd表示S1与S2直接的距离
如果Xi+Xj>mid,说明i和j不能同时与S1相连,添加边(i,~j),(j,~i)
如果Yi+Yj>mid,说明i和j不能同时与S2相连,添加边(~i,j),(~j,i)
如果Xi+Yj+dd>mid,说明 i&&~j=0,即不能把i与S1相连的同时,把j与S2相连,则添加边(i,j),(~j,~i)
如果Xj+Yi+dd>mid,说明 ~i&&j=0,即不能把i与S2相连的同时,把j与S1相连,则添加边(~i,~j),(j,i)
用2-SAT解问题时,要找确定的矛盾关系,这也是为什么二分构图时是判断>mid而不是判断<=mid
另外这道题一开始我的思维狭窄了,对于给定的mid值怎样构图时,我在想i和j究竟是同时连S1,或者同时连S2,或者一个连S1,一个连S2,这几种距离到底哪个最大,这样子想太麻烦,回顾上面的做法,我们根据mid值,将四种距离一一进行判断,如果出现矛盾,则添边。2-SAT的解不一定是唯一的,这也与上面每对点最多可能4中连法相符合,我们只要根据可以得到的条件构图,在算法判断是否存在可行解的时候会帮我们挑选一种连法的,并不需要我们在一开始就去指定
代码: