아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

2-SAT 사전순 최소 배정

시간 제한1초메모리 제한256 MB

요약
최대 10000개 변수와 100000개 절로 된 2-CNF 식을 만족하는 할당 중 사전 순으로 가장 앞선 것을 찾습니다.
난이도

어려움10점 중 8점

유형
그래프, DFS, 위상 정렬, 그리디
정답자
아직 제출이 없습니다

문제

2-SAT은 불리언 변수 x1,x2,…,xNx_1, x_2, \dots, x_N의 값을 정해서 주어진 2-CNF 식을 참으로 만드는 문제다.

2-CNF 식은 (x∨y)∧(¬y∨z)∧(x∨¬z)∧(z∨y)(x \lor y) \land (\lnot y \lor z) \land (x \lor \lnot z) \land (z \lor y) 같은 꼴이다. 괄호로 묶인 부분을 절이라고 하고, 절은 변수 두 개를 ∨\lor로 이은 식이다. ∨\lor는 OR, ∧\land는 AND, ¬\lnot은 NOT을 뜻한다.

변수의 개수 NN과 절의 개수 MM, 그리고 식 ff가 주어진다. ff를 참으로 만드는 배정이 있는지 판정하고, 있으면 그중 사전순으로 가장 앞서는 배정을 구하는 프로그램을 작성하시오.

배정은 각 xix_i가 0(거짓) 또는 1(참)인 길이 NN의 수열 x1,x2,…,xNx_1, x_2, \dots, x_N이다. 두 배정을 비교할 때는 x1x_1부터 차례로 값을 견주어, 값이 처음 달라지는 자리에서 0인 쪽이 앞선다.

입력

첫째 줄에 변수의 개수 NN (1≤N≤100001 \le N \le 10000)과 절의 개수 MM (1≤M≤1000001 \le M \le 100000)이 주어진다. 둘째 줄부터 MM개의 줄에 절이 한 개씩 주어진다.

각 절은 0이 아닌 두 정수 ii와 jj (1≤∣i∣,∣j∣≤N1 \le |i|, |j| \le N)로 이루어진다. 양수는 그 번호의 변수를, 음수는 그 변수의 부정을 뜻한다. 즉 ii가 양수면 xix_i를, 음수면 ¬x−i\lnot x_{-i}를 나타내고 jj도 같은 규칙을 따른다. 한 절에 같은 변수가 두 번 나올 수 있고, 같은 절이 여러 번 주어질 수 있다.

출력

첫째 줄에 식 ff를 참으로 만들 수 있으면 1을, 없으면 0을 출력한다.

만들 수 있으면 둘째 줄에 사전순으로 가장 앞서는 배정을 x1x_1부터 xNx_N까지 공백으로 구분해 출력한다. 참은 1, 거짓은 0으로 적는다. 만들 수 없으면 첫째 줄만 출력한다.

예제2

  1. 예제 1

    입력
    3 4
    -1 2
    -2 3
    1 3
    3 2
    
    예상 출력
    1
    0 0 1
    
  2. 예제 2

    입력
    1 2
    1 1
    -1 -1
    
    예상 출력
    0