【HDU3062】パーティ[2-SAT]

3062 - HDU 

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 = 0int型W = 0CHAR 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 
}

 

おすすめ

転載: www.cnblogs.com/lxyyyy/p/11284726.html