2-sat問題可以通過強連通分量來判斷條件是否矛盾。
而題目往往會要求輸出方案,輸出方案時,強連通分量的scc值,會和原圖的拓撲序緊密聯絡在一起。
#include
using
namespace std;
const
int n=
1e6+5;
int n,m,a,b,nowa,nowb;
int cnt,head[n<<1]
;int col,now,top,dfn[n<<1]
,low[n<<1]
,color[n<<1]
,sta[n<<1]
,si[n<<1]
;bool jay;
struct edgee[n<<1]
;inline
void
add(
int u,
int v)
inline
void
tarjan
(int u)
elseif(
!color[e[i]
.to]
) low[u]
=min
(low[u]
,dfn[e[i]
.to]);
}if(low[u]
==dfn[u])}
intmain()
for(
register
int i=
1; i<=
2*n;
++i)if(
!dfn[i]
)tarjan
(i);
jay=
true
;for
(register
int i=
1; i<=n;
++i)
if(color[i]
==color[i+n]
)//如果i的條件不滿足,就必須滿足i的條件...明顯矛盾,所以"impossible"
//或者這樣理解:如果i=0,那麼i必須等於1;如果i=1,那麼i必須等於0
//所以,請問i到底是等於0還是等於1呢?既然沒有這樣的i,那麼就是"impossible" if(
!jay)
puts
("impossible");
else
return0;
}
洛谷P4782 模板 2 SAT 問題
有 n 個布林變數 x 1 sim x n 另有 m 個需要滿足的條件,每個條件的形式都是 x i 為true false或 x j 為true false 比如 x 1 為真或 x 3 為假 x 7 為假或 x 2 為假 2 sat 問題的目標是給每個變數賦值使得所有條件得到滿足。對於乙個要求 x...
P4782 模板 2 SAT 問題
傳送門 2 sat的板子 把每乙個點拆成選0或選1 條件為 x i 為 a 或 x j 為 b 那麼如果 x i 不為 a 則 x j 必為 b 同理 x j 不為 b 則 x i 必為 a 那麼從 x i 不為 a 的點向 x j 為 b 的點連邊,從 x j 不為 b 的點向 x i 為 a 的...
《P4782 模板 2 SAT 問題》
2 sat問題 就是一些元素,他們的值只能為布林值0,1.給出一些限制關係,並且每對關係都是兩個數之間的。讓你找出一組構造,讓所有關係都滿足。解法 首先要建圖 我們規定,a為1的點為a n,a為0的點為a。那麼對於給定的一對關係a b。如果是a 1,b 1,那麼說明a b。利用可以轉化為 a b,b...