効果の件名:
Nお互いを好きではない人のペアの間1-2 * nを、Mから番号右の人を、持っている、各ペア徐の人々が平和委員会、辞書式の最小のソリューションに参加する一人を選択します
--------------------------------
最小限の辞書順による2-SATの問題は、あなただけの汚れの暴力を求めるSCC方法はできません。O(N×m個)
--------------------------------
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5 使って 名前空間STD。 6 CONST INT MAXN = 16020 。 7 のconst int型 MAXM = 4E4 + 20 。 8 int型N、M。 9 構造体の縁 10 { 11 int型のU、V、NXT。 12 } E [MAXM]。 13 int型ヘッド[MAXN]、JS。 14 ボイド addage(int型のu、int型V) 15 { 16 E [++ JS] .U = U; E [JS] .V = V。 17 E [JS] .nxt =頭部[U];頭部[U] =のJS。 18 } 19 int型CLO [MAXN]、ST [MAXN]、トップ。 20 BOOL DFS(INT X) 21 { 22 であれば(CLO [X] == 1)リターン 1 。 23 であれば(CLO [X] == 2)戻り 0 ; 24 CLO [X] = 1 ; CLOの[X ^ 1 ] = 2 ; 25 ST [++トップ] =のX。 26 のために(int型 I =ヘッド[X]; I; I = E [I] .nxt) 27 { 28 のint V = E [I] .V。 29 もし(!DFS(V))の戻り 0 ; 30 } 31 リターン 1 。 32 } 33 BOOLが飽和() 34 { 35 のmemset(CLO、0、はsizeof CLO)。 36 のために(int型 I = 0 ; iが<(N << 1)、I + = 2 ) 37 { 38 もし(CLO [I])を続けます。 39 トップ= 0 。 40 であれば(!DFS(I)) 41 { 42 一方(上部)CLO [ST [トップ] = 0、CLO [ST [トップ- ] ^ 1 ] = 0 ; 43 もし(!DFS(I ^ 1))の戻り 0 ; 44 } 45 } 46 リターン 1 。 47 } 48 ボイドのinit() 49 { 50 のmemset(ヘッド、0、sizeofのヘッド); 51の JS = 0 。 52 のmemset(CLO、0、はsizeof CLO)。 53 のmemset(ST、0、はsizeof ST)。 54 55 } 56 のint main()の 57 { 58 ながら(scanf関数(" %d個の%のD "、&N、&M)== 2 ) 59 { 60 のinit(); 61 のために(int型、B、I = 1 ; I <= M + I) 62 { 63 のscanf(" %D%dの"、&、&B)。 64 -A-、 - B。 65 addage(B ^ 1 )。 66 addage(B、A ^ 1 )。 67 } 68 場合(飽和()) 69 { 70 のために(int型 i = 0 ; iが=(N << < 1); ++ I) 71 であれば(CLOを[I] == 1)のprintf(" %D \ N "、I + 1 )。 72 } 73の 他のプット(" NIE " )。 74 } 75 リターン 0 。 76 }