Algorithm/python 백준
파이썬 백준 1043번 : 거짓말
✿(๑❛ڡ❛๑)✿
2024. 5. 13. 14:06
728x90
SMALL
문제
https://www.acmicpc.net/problem/1043
🤥풀이
알고리즘
연결요소를 탐색이라고 생각하여 바로 BFS를 떠올렸다.
자료구조
people Graph 표현방식에 인접 리스트를 사용하였다.
visited와 party_people는 이후 issubset을 이용하기 위해 set으로 구현하였다.
1. 파티에 함께 참여하는 사람들을 인접 리스트로 표현한다.
# 예제 입력 1의 결과
people= [[], [2], [1, 3, 4], [2, 4], [2, 3]]
2. 진실을 알고있는 사람들과, 그와 연결되어있는모든 사람들을 방문처리한다.
3. 방문처리된 사람들이 존재하지 않는 파티만 count한다.
import sys
from collections import deque
def BFS(target):
queue=deque()
queue.append(target)
while(queue):
k=queue.pop()
visited.add(k)
for kk in people[k]:
if kk not in visited:
queue.append(kk)
N,M=map(int,sys.stdin.readline().split())
num_know,*known_people=map(int,sys.stdin.readline().split())
party_people=[]
visited=set()
people=[[] for _ in range(N+1)] #모든 사람들을 나타낸 인접 리스트
for _ in range(M):
num_party_people,*temp_party_people=map(int,sys.stdin.readline().split())
for i in temp_party_people: #people만들기
for j in temp_party_people:
if i!=j:
people[i].append(j)
party_people.append(set(temp_party_people))
for know in known_people: # 진실을 알고 있는사람과 연결되어있는모든 사람을 방문처리함
if know not in visited:
BFS(know)
cnt=0
for party in party_people:
if not party.issubset(visited): #방문처리된사람으로 이루어지지 않은 파티의 경우
cnt+=1 #cnt 증가
print(cnt)
728x90
LIST