DHistory
[Baekjoon] Graph - 1043 거짓말 본문
문제
풀이
진실을 아는 인원가 같은 집합에 속한 경우 진실을 아는 경우로 생각한다.
서로소 집합(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)
채점 결과
'Computer Science > Algorithm' 카테고리의 다른 글
[Baekjoon] DP - 1082 방 번호 (오답노트) (0) | 2023.11.03 |
---|---|
[Baekjoon] DFS - 1068 트리 (0) | 2023.11.01 |
[Baekjoon] Greedy - 1041 주사위 (0) | 2023.11.01 |
[Baekjoon] Topology Sort - ACM Craft (0) | 2023.10.31 |
[Baekjoon] Shortest Path - 15723 n단 논법 (0) | 2023.10.31 |