백준공부/java
[백준] 1043번 거짓말 (gold 4
gomduri43
2024. 3. 9. 00:09
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args )throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st=new StringTokenizer(br.readLine());
int n=Integer.valueOf(st.nextToken());
int m=Integer.valueOf(st.nextToken());
//아직 어떻게 사람들 관계가 어떻게 연결되는지 모르므로 입력을 그냥 받아놓음.
ArrayList<Integer>[] arr=new ArrayList[m];
for(int i=0; i<m; i++){
arr[i]=new ArrayList<>();
}
//사람간의 관계 true이면 연결됨
boolean[][] map=new boolean[n+1][n+1];
//사실을 아는사람
boolean[] real=new boolean[n+1];
st=new StringTokenizer(br.readLine());
int t=Integer.valueOf(st.nextToken());
for(int i=0; i<t; i++){
real[Integer.valueOf(st.nextToken())]=true;
}
//파티 시작. 사람들 도착
//파티케이스에 추가해서 누가왔는지
//그리고 파티 처음온사람을 나머지와 그래프로 연결.
//왜냐하면 후에 진실을 아는 사람에서 넓이우선을 나아가면 이와 연결된 사람들도 모두
//체크가능하므로 결국 진실알게되는 사람들 판별가능
for(int i=0; i<m; i++){
st=new StringTokenizer(br.readLine());
int pn=Integer.valueOf(st.nextToken());
int fp=Integer.valueOf(st.nextToken());
arr[i].add(fp);
for(int j=0; j<pn-1; j++){
int temp=Integer.valueOf(st.nextToken());
map[fp][temp]=true;
map[temp][fp]=true;
arr[i].add(temp);
}
}
Queue<Integer> que=new LinkedList<>();
boolean[] visit=new boolean[n+1];
for(int i=1; i<=n; i++){
if(real[i]){
que.offer(i);
visit[i]=true;
}
}
//진실아는 사람과 연결관계 파악
while(!que.isEmpty()){
int temp=que.poll();
for(int i=1; i<=n; i++){
if(map[temp][i]){
real[i]=true;
if(!visit[i]) {
visit[i] = true;
que.offer(i);
}
}
}
}
//파티마다 진실아는 사람 체크해서 있으면 패스
//없으면 +1;
int answer=0;
for(int i=0; i<m; i++){
boolean find=false;
for(int j=0; j<arr[i].size(); j++){
if(real[arr[i].get(j)]){
find=true;
break;
}
}
if(!find){
answer++;
}
}
bw.write(answer+"");
bw.flush();
}
}