사용자 도구

사이트 도구


ps:problems:boj:3648

아이돌

ps
링크acmicpc.net/…
출처BOJ
문제 번호3648
문제명아이돌
레벨플래티넘 3
분류

2-sat

시간복잡도O(T*(n+m))
인풋사이즈T<=?, n<=1000, m<=2000
사용한 언어Python
제출기록32688KB / 444ms
최고기록276ms
해결날짜2022/11/03
태그

[단계]강한 연결 요소 [라이]2-SAT 문제

풀이

  • 기본적인 2-SAT문제. 참가자마다 변수를 만들고, i번 참가자가 탈락이면 x_i=False, 통과면 x_i=True로 모델링 하면, 심사위원들마다 or 절이 한개씩 나온다. 여기까지는 사실상 입력 포맷까지도 2-SAT - 3과 똑같다
  • 여기에 추가적으로 1번 참가자는 항상 통과해야 한다는 조건이 붙는다. (x_1 or x_1)절을 추가해주기만 하면 된다.
  • n개의 변수와 m개의 절로 CNF가 만들어지므로, 총 시간복잡도는 O(n+m)

코드

"""Solution code for "BOJ 3648. 아이돌".

- Problem link: https://www.acmicpc.net/problem/3648
- Solution link: http://www.teferi.net/ps/problems/boj/3648

Tags: [2-sat]
"""

import sys
from teflib import twosat


def main():
    while line := sys.stdin.readline():
        n, m = [int(x) for x in line.split()]
        two_sat = twosat.TwoSat(n)
        for _ in range(m):
            a, b = [int(x) for x in sys.stdin.readline().split()]
            x = a - 1 if a > 0 else a
            y = b - 1 if b > 0 else b
            two_sat.x_or_y(x, y)
        two_sat.x_is_true(0)

        print('yes' if two_sat.is_satisfiable() else 'no')


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
C D B E A
 
ps/problems/boj/3648.txt · 마지막으로 수정됨: 2022/11/07 15:43 저자 teferi