기타/코딩테스트
(코테) 백준_1976_여행 가자 *유니온 파인드
불광동 물주먹
2025. 5. 30. 17:46

import java.util.*;
import java.io.*;
/*
3
3
0 1 0
1 0 1
0 1 0
1 2 3
*/
public class Main {
static int N,M;
static int[] parents;
static int[][] map;
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
parents = new int[N+1];
map = new int[N+1][N+1];
for(int i=1;i<N+1;i++) {
parents[i] =i;
}
for(int i=1;i<N+1;i++) { // 여행지
st = new StringTokenizer(br.readLine());
for(int j =1;j<N+1;j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j]==1) { //연결된 여행지임 1
union(i,j);
}
}
}
st = new StringTokenizer(br.readLine());
int reffere =Integer.parseInt(st.nextToken());
boolean flag = false;
for(int i=1;i<M;i++) { //여행 계획
int now=Integer.parseInt(st.nextToken());
if((find(reffere)!=find(now))) {
flag = true;
break;
}
reffere = now; //최신화
}
if(flag) System.out.print("NO");
else System.out.print("YES");
}
public static int find(int num) {
if(parents[num]==num) return num; //루트값인지?
else return parents[num] = find(parents[num]);//아니라면 최상위 부모 찾기
}
public static void union(int x , int y) {
int a=find(x); //루트 찾기
int b=find(y); //루트 찾기
if (a != b) { //값이 동일하면 pass
if (a < b) parents[b] = a; ////최상위 루트(부모) 설정 (작은 값이 부모로)
else parents[a] = b;
}
}
}