BOJ 1043: 거짓말
문제 풀이
파티 인원을 입력 받으면서 파티에 온 사람들끼리 연결(connnect)을 설정한다.
진실을 아는 사람부터 시작해서 dfs로 진실을 퍼트린다.
진실은 한 파티의 모든 사람에게로 퍼져나가기 때문에 파티에 온 사람 한명만 조사해도 알 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, M;
static boolean[] know;
static boolean[][] connect;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
know = new boolean[N + 1];
st = new StringTokenizer(br.readLine());
int liarCount = Integer.parseInt(st.nextToken());
if(liarCount == 0) {
System.out.println(M);
return;
}
for(int i = 0; i < liarCount; i++) {
know[Integer.parseInt(st.nextToken())] = true;
}
connect = new boolean[N + 1][N + 1];
int[][] party = new int[M][];
for(int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int partyCount = Integer.parseInt(st.nextToken());
party[i] = new int[partyCount];
party[i][0] = Integer.parseInt(st.nextToken());
for(int j = 1; j < partyCount; j++) {
party[i][j] = Integer.parseInt(st.nextToken());
connect[party[i][j - 1]][party[i][j]] = connect[party[i][j]][party[i][j - 1]] = true;
}
}
for(int i = 1; i <= N; i++) {
if (know[i]) {
dfs(i);
}
}
int answer = 0;
for(int i = 0; i < M; i++) {
if(!know[party[i][0]]) {
answer++;
}
}
System.out.println(answer);
}
public static void dfs(int n) {
for(int i = 1; i <= N; i++) {
if(connect[n][i] && !know[i]) {
know[i] = true;
dfs(i);
}
}
}
}
Author And Source
이 문제에 관하여(BOJ 1043: 거짓말), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wonhee010/BOJ-1043-거짓말저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)