SSONG Cloud
[백준] 1043 거짓말 본문
반응형
문제 출처: www.acmicpc.net/problem/1043
1043번: 거짓말
지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게
www.acmicpc.net
: 지민이가 거짓말쟁이로 알려지지 않으면서, 과장된 이야기를 할 수 있는 파티 개수의 최대값을 구해야 한다.
: union-find 알고리즘을 사용할 수 있다.
: 주의할 점은 하나의 파티에서 진실을 아는 사람이 하나라도 있으면 진실을 모르는 사람의 부모가 진실을 아는 사람이 되도록 해야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N, M;
static int[] p;
static ArrayList<Integer>[] party;
private static int find(int idx) {
if (p[idx] < 0 || p[idx] == idx) return idx;
return p[idx] = find(p[idx]);
}
private static void union(int a, int b) {
int aRoot = find(a);
int bRoot = find(b);
if(aRoot != bRoot) {
if(aRoot == p[aRoot]) p[bRoot] = aRoot;
else p[aRoot] = bRoot;
}
}
public static void main(String[] args) throws IOException {
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
party = new ArrayList[M+1];
for(int i = 0; i < M+1; i++) {
party[i] = new ArrayList<>();
}
p = new int[N + 1];
Arrays.fill(p, -1);
st = new StringTokenizer(br.readLine());
int tN = Integer.parseInt(st.nextToken());
for (int i = 0; i < tN; i++) {
int idx = Integer.parseInt(st.nextToken());
p[idx] = idx;
}
for (int i = 1; i < M+1; i++) {
st = new StringTokenizer(br.readLine());
int total = Integer.parseInt(st.nextToken());
// 한명이라도 진실을 아는 사람이 있다면 진실을 말해야함
for (int j = 0; j < total; j++) {
party[i].add(Integer.parseInt(st.nextToken()));
}
int size = party[i].size();
if(size >=2) {
int first = party[i].get(0);
for(int j = 1; j < size; j++ ) {
union(first, party[i].get(j));
}
}
}
int cnt = 0;
// for(ArrayList sub : party)
// System.out.println(Arrays.toString(sub.toArray()));
// System.out.println(Arrays.toString(p));
//
for (int i = 1; i < M+1; i++) {
for(int j = 0, size=party[i].size(); j < size; j++) {
int tmp = find(party[i].get(j));
if(p[tmp] != tmp) {
cnt++;
break;
}
}
}
System.out.println(cnt);
}
}
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1904 01타일 (0) | 2021.04.06 |
---|---|
[백준] 2580 스도쿠 (0) | 2021.04.06 |
[백준] 1929 소수 구하기 (0) | 2021.04.01 |
[백준] 11054 가장 긴 바이토닉 부분 수열 (0) | 2021.04.01 |
[백준] 2589 보물섬 (0) | 2021.04.01 |
Comments