2-SAT問題テンプレート
1モルは愚かなミスを犯したQAQを言いません
#include <iostreamの> する#include <cstdioを> する#include <キュー> の#include <CStringの> する#include <cmath> の#include <ベクトル> の#include <スタック> の#include <アルゴリズム> 使用して 名前空間STD。 CONSTの INT N = 2000 + 5、M = 1E6 + 5、INF = 0x3f3f3f3f、P = 9999973 。 INTのN、M。 テンプレート < クラス T> ボイド RD(T&X){ X = 0。int型W = 0。CHAR CH = 0 。 しばらく W | = CH ==(isdigit(CH)!)' - '、CH = getchar関数(); 一方、(isdigit(CH))X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR()。 X?= W - X:X; } int型のヘッド[N]、TOT = 0 。 構造体の縁{ int型、U、V、NXT;} E [M << 1 ]。 ボイド追加(INT U、INT V){ E [ ++ TOT =(エッジ){U、V、ヘッド[U]}、ヘッド[U] = TOT。 } スタック < int型 > S; ブール工大[N]。 INT IDX = 0、BCNT = 0 、DFN [N]、低[N]、BL [N]。 無効 tarjan(INT U){ DFN [U] =低[U] = ++ IDX。 s.push(U);工大[U] = 1 。 用(int型 ; I I = I =ヘッド[U]、V {E [I] .nxt) V = E [I] .V。 もし tarjan(V)、低[U] =(DFN [V]!)分(低[U]、低い[V])。 そう であれば(工大[V] && DFN [V] <低[U])低[U] =のDFN [V]。 } 場合(DFN [U] == 低[U]){ int型の V; ++ BCNT。 実行{ V = s.top();()s.pop。 BL [V] = BCNT。 工大[V] = 0 ; } 一方(V =!U)。 } } int型のmain(){ // freopenは( "in.txt"、 "R"、STDIN)。 一方、(scanf関数(" %D%dの"!、&N、&M)= EOF){ memsetの(頭、0、はsizeof (ヘッド))。 TOT = BCNT = IDX = 0 。 memset(DFN、0、はsizeof (DFN))。 memsetの(低い、0、はsizeof (低))。 memset(BL、0、はsizeof (BL))。 memset(工大、0、はsizeof (インスト))。 しばらく(!s.empty())s.pop(); 用(int型 I = 1、X、Y、XX、YY; I <= M; ++ I){ RD(x)は、RD(Y)、RD(XX)、RD(YY)。 X =(X << 1)+ X-X、Y =(Y << 1)+ YY。 追加の(x、y ^ 1)、(Y、X ^追加1 )。 } のための(int型 I = 0 ; iが<(N << 1); ++ i)が あれば(!tarjan(I)DFN [I])。 int型フラグ= 0 。 以下のために(int型 i = 0 ; iがn <; ++ I) であれば(BL [I << 1 ] == BL [I << 1 | 1 ])フラグ= 1 。 もし(!フラグ)プット(" YES " ); 他のプット(「NO 」); } 戻り 0 。 }