RiseOJ는 solved.ac와 제휴 관계가 없습니다. 티어 아이콘 © solved.ac. solved.ac
포럼
R00707

3-SAT 충족 (상전이 지점)

스페셜 저지 — 출력을 사용자 정의 프로그램으로 검사하므로 여러 정답이 인정될 수 있습니다.
Master 마스터
난이도
5s
시간 제한
256MB
메모리 제한
0
맞았습니다!!
0
제출 수
0.0%
정답률
레이팅

의견: 0

설명

부울 변수 \(x_1, x_2, \dots, x_n\)이 있다. \(m\)개의 절(clause)이 주어지며, 각 절은 세 개의 리터럴(literal)의 논리합(\(\lor\))이다. 리터럴은 \(x_i\) 또는 그 부정 \(\lnot x_i\)이며, 입력에서는 부호 있는 정수 \(\pm i\)로 표현된다(\(+i\)\(x_i\), \(-i\)\(\lnot x_i\)).

전체 식은 모든 절의 논리곱(\(\land\))이다. 모든 절을 동시에 참으로 만드는 변수 할당을 하나 찾아 출력하여라(각 절에서 최소 한 리터럴이 참이면 그 절은 참이다).

이 문제는 3-SAT로, 대표적인 NP-완전 문제이다. 다항 시간 알고리즘은 알려져 있지 않으며, 존재한다면 \(P = NP\)가 증명된다. 게다가 이 인스턴스들은 절/변수 비율 \(m/n \approx 4.26\), 즉 충족 가능성 상전이(phase transition) 부근에서 생성되어 탐색이 가장 어려운 영역에 놓여 있다. 모든 인스턴스는 충족 가능함이 보장된다.

모든 절을 만족시키는 어떤 할당이든 정답으로 인정된다.

제약

\(3 \le n \le 400\)

\(1 \le m \le 2000\)

각 절은 세 리터럴로 이루어지며 \(1 \le |\ell_k| \le n\), \(\ell_k \ne 0\).

모든 인스턴스는 충족 가능함이 보장된다.

입력 형식

첫 줄에 변수의 수 \(n\)과 절의 수 \(m\)이 주어진다.

다음 \(m\)개의 줄에 각 절을 이루는 세 리터럴 \(\ell_1\ \ell_2\ \ell_3\)이 주어진다. 각 \(\ell_k\)\(0\)이 아닌 정수이며 \(1 \le |\ell_k| \le n\)이다.

출력 형식

모든 절을 만족시키는 할당을 출력한다. \(n\)개의 \(0\)/\(1\) 값을 공백으로 구분하여 한 줄에 출력하거나(왼쪽부터 \(x_1, \dots, x_n\)), 또는 길이 \(n\)\(0\)/\(1\) 문자열 한 줄로 출력해도 된다. \(1\)은 참, \(0\)은 거짓을 뜻한다.

예제 1
입력
3 3
1 2 3
-1 2 3
1 -2 3
출력
1 1 1
설명

세 절 모두 리터럴 \(x_3\) 또는 \(x_2\)로 참을 만들 수 있다. 예를 들어 \(x_1=x_2=x_3=1\)이면 모든 절이 만족된다.

예제 2
입력
3 2
-1 -2 3
1 -2 -3
출력
001
설명

\(x_1=0, x_2=0, x_3=1\)로 두면 첫 절은 \(\lnot x_1\)이 참, 둘째 절은 \(\lnot x_2\)가 참이 되어 모두 만족된다. 답은 문자열 001로도 출력할 수 있다.

문제 정보

riseoj 작성

출처 Original

평가 및 의견

3-SAT 충족 (상전이 지점)

개요
출제자 난이도 Master 마스터 의견 0 / 50 공개 집계 (커뮤니티 난이도, 주요 주제, 품질)는 의견이 충분히 모이면 공개됩니다.

Log in to rate problems.

개별 의견

아직 의견이 없습니다. 자격이 된다면 위 양식에서 가장 먼저 평가해 보세요.

풀이 제출

3-SAT 충족 (상전이 지점)

게스트로 둘러보고 있습니다. 로그인하면 풀이를 제출하고 진행 상황을 확인할 수 있습니다. 로그인하고 제출하기
공개
C++20 Tab 들여쓰기 · Ctrl+/ 주석 토글 · Enter 자동 들여쓰기
1 1 1 0 공백: 4 · UTF-8