이 문제를 해결하기 위해서는 진실을 아는 사람들과 연결된 모든 파티와 사람들을 탐색하고, 이 파티들을 제외한 나머지 파티에서 거짓말을 할 수 있는지 판단해야 합니다.
import java.io.*;
import java.util.*;
public class Boj1043 {
static int n, m;
static Set<Integer> truePeople = new HashSet<>(); // 진실을 아는 사람
static List<List<Integer>> party = new ArrayList<>();
static boolean[] partyRestricted; // 거짓말을 할 수 없는 파티
static List<List<Integer>> partiesOfPeople = new ArrayList<>(); // 각 사람별로 참석한 파티 목록
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
n = Integer.parseInt(input[0]); // 사람 수
m = Integer.parseInt(input[1]); // 파티 수
String[] trues = br.readLine().split(" ");
int trueNumber = Integer.parseInt(trues[0]); // 진실을 아는 사람 수
for (int i = 1; i <= trueNumber; i++) {
truePeople.add(Integer.parseInt(trues[i]));
}
// 초기화
for (int i = 0; i <= n; i++) {
partiesOfPeople.add(new ArrayList<>());
}
partyRestricted = new boolean[m];
// 파티 정보 입력 및 사람과 파티 관계 매핑
for (int i = 0; i < m; i++) {
String[] str = br.readLine().split(" ");
int partySize = Integer.parseInt(str[0]);
List<Integer> currentParty = new ArrayList<>();
for (int j = 1; j <= partySize; j++) {
int person = Integer.parseInt(str[j]);
currentParty.add(person);
partiesOfPeople.get(person).add(i); // 사람별 참석 파티 등록 => 해당 person이 참석한 파티 번호
}
party.add(currentParty);
}
// BFS를 사용하여 진실을 전파하는 과정
Queue<Integer> queue = new LinkedList<>(truePeople); // 진실을 아는 사람들로 구성
while (!queue.isEmpty()) {
int person = queue.poll();
for (int p : partiesOfPeople.get(person)) { // 진실을 아는 사람들이 존재하는 파티
if (!partyRestricted[p]) {
partyRestricted[p] = true; // 해당 파티는 거짓말을 할 수 없음
for (int participant : party.get(p)) {
if (!truePeople.contains(participant)) {
truePeople.add(participant);
queue.add(participant); // 새로운 사람을 진실을 아는 사람에 추가
}
}
}
}
}
// 거짓말할 수 있는 파티 개수 계산
int answer = 0;
for (int i = 0; i < m; i++) {
if (!partyRestricted[i]) {
answer++;
}
}
System.out.println(answer);
}
}
이 문제의 핵심은 진실을 아는 사람과 연결된 모든 사람과 파티를 찾아내는 것이지, 특정 파티를 먼저 탐색하는 순서에 의해 결과가 달라지는 것은 아닙니다.
예를 들어, 다음과 같은 상황을 생각해봅시다:
파티 구성
진실을 아는 사람 1을 시작으로 파티를 탐색하면 다음과 같은 전파가 일어납니다:
따라서, 파티 1, 2, 3은 모두 거짓말을 할 수 없습니다. 파티 4는 진실을 아는 사람과 연결되어 있지 않으므로 거짓말을 할 수 있습니다.
어떤 파티를 먼저 방문하든, 결과는 동일하게 됩니다.
탐색 순서가 중요한 문제는 아니며, 모든 연결된 파티를 탐색하는 것이 중요합니다. BFS든 DFS든 모두 연결된 컴포넌트를 한 번에 탐색하기 때문에, 탐색 순서에 관계없이 최종 결과는 동일합니다.