시간제한 : 2초, 난이도 : 골드 4, 백준 : 1043번
예제 입력1
4 3 //사람 수, 파티 수
0 //진실을 아는 사람 정보
2 1 2 //파티 정보
1 3
3 2 3 4
출력
3
예제 입력6
8 5
3 1 2 7
2 3 4
1 5
2 5 6
2 6 8
1 8
출력
5
import java.util.ArrayList;
import java.util.Scanner;
public class Practice52 {
public static int[] parent; //대표 노드 저장 배열
public static int[] trueP; //진실을 아는 사람 데이터
public static ArrayList<Integer>[] party; //파티 데이터
public static int result;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); //사람 수
int M = sc.nextInt(); //파티 수
int T = sc.nextInt(); //진실을 아는 사람 정보
result = 0;
trueP = new int[T];
for(int i = 0; i < T; i++) {
trueP[i] = sc.nextInt();
}
party = new ArrayList[M];
for(int i = 0; i < M; i++) {
party[i] = new ArrayList<Integer>();
int party_size = sc.nextInt();
for(int j = 0; j < party_size; j++) {
party[i].add(sc.nextInt());
}
}
parent = new int[N + 1];
for(int i = 0; i <= N; i++) {
parent[i] = i;
}
for(int i = 0; i < M; i++) {
int firstPeople = party[i].get(0);
for(int j = 1; j < party[i].size(); j++) {
union(firstPeople, party[i].get(j));
}
}
for(int i = 0; i < M; i++) {
boolean isPossible = true;
int cur = party[i].get(0);
for(int j = 0; j < trueP.length; j++) {
if(find(cur) == find(trueP[j])) {
isPossible = false;
break;
}
}
if(isPossible) result++;
}
System.out.println(result);
sc.close();
}
public static void union(int a, int b) {
a = find(a);
b = find(b);
if(a != b) {
parent[b] = a;
}
}
public static int find(int a) {
if(a == parent[a])
return a;
else
return parent[a] = find(parent[a]);
}
}