DHistory

[Baekjoon] Graph - 1043 거짓말 본문

Computer Science/Algorithm

[Baekjoon] Graph - 1043 거짓말

ddu0422 2023. 11. 1. 18:18

문제

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

풀이

진실을 아는 인원가 같은 집합에 속한 경우 진실을 아는 경우로 생각한다.

서로소 집합(disjoint sets)을 활용하여 진실을 아는 집합을 구한다.

 

import sys
import itertools

n, m = map(int, sys.stdin.readline().rstrip().split())
knows = list(map(int, sys.stdin.readline().rstrip().split()))[1:]
parties = []
parent = [i for i in range(n + 1)]

# 진실을 아는 인원
for know in knows:
    parent[know] = -1


def find_parent(parent, x):
    if parent[x] != x:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]


def union_parent(parent, x, y):
    x = find_parent(parent, x)
    y = find_parent(parent, y)

    if x < y:
        parent[y] = x
    else:
        parent[x] = y


for _ in range(m):
    people = list(map(int, sys.stdin.readline().rstrip().split()))[1:]
    parties.append(people)

    # 한 파티에 2명 이상인 경우 같은 집합으로 묶음
    for x, y in itertools.combinations(people, 2):
        union_parent(parent, x, y)


result = 0

for party in parties:
    know = False

    # 파티에서 진실을 아는 인원이 있는 경우 해당 파티에서는 과장을 할 수 없음
    for person in party:
        if find_parent(parent, person) == -1:
            know = True
            break

    if not know:
        result += 1

print(result)

 

채점 결과