POJ 2749 Building Roads

7 篇文章 0 订阅

由于某个养牛场只能连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中连法相符合,我们只要根据可以得到的条件构图,在算法判断是否存在可行解的时候会帮我们挑选一种连法的,并不需要我们在一开始就去指定

 

代码:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值