【总结】2-SAT

来源:互联网 发布:数据库性能监控工具 编辑:程序博客网 时间:2024/05/20 03:07
一、2-SAT 简介:
   SAT是适定性(Satisfiability)问题的简称 。一般形式为k-适定性问题,简称 k-SAT。
当k>2时,k-SAT是NP完全的。因此一般讨论的是k=2的情况,即2-SAT问题。
2-SAT就是2判定性问题(条件只有一个,不是这个就是那个),是一种特殊的逻辑判定问题。
2-SAT,简单的说就是给出n个集合,每个集合有两个元素,已知若干个<a,b>,表示a与b矛盾(其中a与b属于不同的集合)。然后从每个集合选择一个元素,一共选n个两两不矛盾的元素。显然可能有多种选择方案,一般题中只需要求出一种即可。

  附:伍昱的《由对称性解2-SAT问题》
          赵爽的《2-SAT解法浅析》
二、2-SAT 算法流程:
 1.构图   (重点+难点)
 2.求图的极大强连通子图 (模板)
 3.把每个子图收缩成单个节点,根据原图关系构造一个有向无环图 (模板)
 4.判断是否有解,无解则输出(退出) (这块常用到二分枚举答案)
 5.对新图进行拓扑排序 (模板)
 6.自底向上进行选择、删除 (模板)
 7.输出(模板)

三、2-SAT 个人学习思路:
 1.看课件了解什么是2-SAT
 2.学习如何求极大强连通分量(tarjan、kosaraju)
 3.构图,找题目所述的相互矛盾,使不矛盾的那个状态必连,形成有入度出度的有向图
 4.2-sat包括判断和求方案
    判断是否可行只需判断一个点的两个状态是否在一个环里,在的话就无解
    求可行方案,貌似这类的题都会是special judge 因为拓扑序不唯一。 没错,做法就是对 缩点后的新图进行拓扑(用kosaraju的好处是第二次dfs后已经形成拓扑序),然后逆拓扑序进 行选择(删除相对的),逆着是因为这样不会牵及别的,例如入度为0的不止一个等等的,貌似是。
 5.2-sat就这么些,然后就是与别的进行组合(嵌套)使用

四、2-SAT 实战应用
1、伍昱的《由对称性解2-SAT问题》例题
          Peaceful Commission [POI2001]和平委员会

                构图:
             
 若I和J冲突,则I向J'连边,J向I'连边

            代码+题解报告 
2、Pku 6题说法
               ⑴POJ 3207 - Ikki's Story IV - Panda's Trick   
                 构图: 
                   把每个线段看成两个点,I代表在圆外,I'代表在圆外。若I和J相交,则I向J'连一条边,J'向I连一条边,I'向J连一条边,J向I'连一条边。
             代码+题解报告 

              ⑵POJ 3678 - Katu Puzzle      
                构图
             把每个变量X看成两个点,I代表0,I'代表1。
             把每个变量Y看成两个点,J代表0,J'代表1。
             Add(I,J)代表从I向J连一条有向边。
             构图,分情况讨论:
              1) X AND Y=1,Add(I',J'),Add(J',I'),Add(I,I'),Add(J,I')
              2) X AND Y=0,Add(I',J),Add(J',I)
              3) X OR Y=1,Add(I,J'),Add(J,I')
              4) X OR Y=0,Add(I,J),Add(J,I),Add(I',I),Add(J',J)
              5) X XOR Y=1,Add(I',J),Add(J',I),Add(I,J'),Add(J,I')
              6) X XOR Y=0,Add(I',J'),Add(J',I'),Add(I,J),Add(J,I)
          代码+题解报告

          ⑶POJ 2723 - Get Luffy Out  
             构图:
          1)若X和Y在同一个门上,则X向Y'连一条边,Y向X'连一条边。
           2)若两个X在同一个门上,则X必然会使用,则X'向X连一条边 
         代码+题解报告 

         ⑷POJ 3683 - Priest John's Busiest Day
          构图:
          设区间(A,B)分为I和I'两个区间。
          若I和J和J'相交,则I肯定不能选,从I向I'连一条边。
          若I仅和J相交,则I向J'连一条边,J向I'连一条边。
          若I仅和J'相交,则I向J连一条边,J'向I'连一条边。
        代码+题解报告 

      ⑸POJ 2749 - Building roads  
          构图:
         把X点连到1号中转站上设为I点,连到2号中转站上设为I'点。
         把Y点连到1号中转站上设为J点,连到2号中转站上设为J'点。
         四种构图方式:
           1) Add(I,J'),Add(J,I')
           2) Add(I',J),Add(J',I)
           3) Add(I,J),Add(J',I')
           4) Add(I',J'),Add(J,I)
         对于题目中的输入信息,当两个点必须连到一个中转站上时,使用3,4号构图方式。
                                                    当两个点必须不连到一个中转站上时,使用1,2号构图方式。
         设Dis1[I]代表I到1号中转站的距离,Dis2[I]代表I到2号中转站的距离,D代表中转站之间的距离,每次二分答案Ans。
         若Dis1[I]+Dis1[J]>Ans,使用1号构图方式
         若Dis2[I]+Dis2[J]>Ans,使用2号构图方式
         若Dis1[I]+Dis2[J]+D>Ans,使用3号构图方式
         若Dis2[I]+Dis1[J]+D>Ans,使用4号构图方式。
       代码+题解报告 

      ⑹POJ 3648- Wedding
         构图:
        若I和J冲突,则I向J'连边,J向I'连边
        1号点必须选(从2向1连一条有向边即可)
      代码+题解报告 

  6道题代码构图题解皆参考于Cow Cai0715 题解 
3、pku 第7题
  PKU2296 Map Labeler(未解之谜)

     构图:

       先设2*i:矩形放点i上面 2*i+1:矩形放点i下面,那么首先当abs(x[i]-x[j]) >= r时必定是可以任意放的。而当abs(x[i]-x[j]) < r时:                      ①abs(y[i]-y[j]) < r:当y[i] == y[j]时两个点的矩形可以一上一下,否则只能是上面的点的矩形放上面,下面的点的矩形放下面。              ②abs(y[i]-y[j]) < 2*r:除了上面的点的矩形放下面,下面的点的矩形放上面的情况都是可以的

     代码+题解报告
4、Hdu 2题

  Hdu 3062 Party(未解之谜)

    构图

      若I,J矛盾,则I和J’,J和I‘连边

  Hdu 3622 Bomb Game(未解之谜)

      构图:

          每个组里选一个炸弹,对于不同组的两个炸弹i和炸弹j只要有dis[i][j] <= 2*r的话那么炸弹i就与炸弹j冲突,连边i->j^1和j->i^1 

五、学习小结
 自从开始学2-sat,就发现代码还是打格好,不然调试真麻烦。。
  自从开始学2-sat,才知道除了太监(tarjan)还有kosaraju
  自从开始学2-sat,就被HDU那个提交程序要写while not eof 暴虐
  自从开始学2-sat,special judge 给我留下了不小的阴影
   好吧扯完了。。。












原创粉丝点击