洛谷 P4782 模板 2 SAT 問題

2021-10-09 09:58:41 字數 1205 閱讀 8536

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...