# ã¯ã©ã¹ TwoSAT 2-SATãè§£ãã¾ãã 夿° `x[0], x[1], â¯, x[N - 1]` ã«é¢ãã¦ã `(x[i] = f) ⨠(x[j] = g)` ã¨ããã¯ãã¼ãºãè¶³ããããããã¹ã¦æºãã夿°ã®å²å½ãããããè§£ãã¾ãã ## ã³ã³ã¹ãã©ã¯ã¿ ```java public TwoSAT(int n) ``` `n` 夿°ã®2-SATãä½ãã¾ãã è¨ç®é $O(n)$ ## ã¡ã½ãã ### addClause ```java public void addClause(int x, boolean f, int y, boolean g) ``` `(x[i] = f) ⨠(x[j] = g)` ã¨ããã¯ãã¼ãºãè¶³ãã¾ãã å¶ç´ - `0 <= i < n` - `0 <= j < n` è¨ç®é ãªãã $O(1)$ ### addImplication ```java public void addImplication(int x, boolean f, int y, boolean g) ``` `(x[i] = f) â (x[j] = g)`, å³ã¡ `(x[i] = !f) ⨠(x[j] = g)` ã¨ããã¯ãã¼ãºãè¶³ãã¾ãã å¶ç´ - `0 <= i < n` - `0 <= j < n` è¨ç®é ãªãã $O(1)$ ### addNand ```java public void addNand(int x, boolean f, int y, boolean g) ``` `!((x[i] = f) â§ (x[j] = g))`, å³ã¡ `(x[i] = !f) ⨠(x[j] = !g)` ã¨ããã¯ãã¼ãºãè¶³ãã¾ããç¦æ¢å¶ç´ã®è¿½å ã¨èããã¨ããã§ãã å¶ç´ - `0 <= i < n` - `0 <= j < n` è¨ç®é ãªãã $O(1)$ ### satisfiable ```java public boolean satisfiable() ``` æ¡ä»¶ãè¶³ãå²å½ãåå¨ãããã©ãããå¤å®ãããå²å½ãåå¨ãããªãã° `true`ãããã§ãªããªã `false` ãè¿ãã å¶ç´ - è¤æ°åå¼ã¶ãã¨ãå¯è½ã è¨ç®é è¶³ããå¶ç´ã®åæ°ã `m` ã¨ã㦠$O(n+m)$ ### answer ```java public boolean[] answer() ``` `satisfiable` ãæå¾ã«å¼ãã æç¹ã§ã®ãã¯ãã¼ãºãæºããå²å½ãè¿ããå²å½ãåå¨ããªãã£ãå ´å㯠`null` ãè¿ãã __`satisfiable` ãä¸åº¦ãå¼ãã§ããªãæç¹ã§å¼ã°ããå ´åã¯ãå®è¡æä¾å¤ `UnsupportedOperationException` ãçºçãã¾ã (`satisfiable` ã®å¼ã³å¿ã鲿¢)ã__ å¶ç´ - __`satisfiable` ãå°ãªãã¨ã 1 åã¯å¼ãã§ãã__ è¨ç®é $O(n)$ ## 使ç¨ä¾ [AtCoder Library Practice Contest H - Two SAT](https://atcoder.jp/contests/practice2/submissions/16647102)