반응형
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_1976 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st ;
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
int plan[] = new int [M];
int parent[] = new int[N+1];
for(int i=1; i<=N; i++) {
parent[i] = i; //parent 배열에 1부터 N까지 저장
}
for(int i=1; i<=N; i++) {
st = new StringTokenizer(br.readLine());
for(int j=1; j<=N; j++) {
int num = Integer.parseInt(st.nextToken());
if(num == 1) { //연결됐을 때
Union(parent, i, j); //연결 해줌
}
}
}
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
plan[i] = Integer.parseInt(st.nextToken());
}
boolean flag = true; //갈 수 있는 플랜인지 판별 하는 변수
for(int i=0; i<M-1; i++) { //도시가 3개면 2개만 판별해도 알 수 있다
if(!Find(parent, plan[i], plan[i+1])) { //부모노드가 다르면
flag = false;
break;
}
}
if(flag) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
private static int getParent(int[] parent, int a) {
if(parent[a] == a) {
return a;
}else {
return parent[a] = getParent(parent, parent[a]); //부모노드랑 자식노드가 다르면
//다시 getParent를 현재 부모노드를 찾아서
//그 부모노드의 부모노드가 최종 부모노드가 된다,,
}
}
private static boolean Find(int[] parent, int a, int b) {
int parent1 = getParent(parent, a);
int parent2 = getParent(parent, b);
if(parent1 == parent2) {
return true;
}else {
return false;
}
}
private static void Union(int[] parent, int a, int b) {
int parent1 = getParent(parent, a);
int parent2 = getParent(parent, b);
if(parent1 <= parent2) { //1 2
parent[parent2] = parent1; // parent[2] = 1 -> 2의 부모노드는 1이다.
}else {
parent[parent1] = parent2;
}
}
}
// 복습 또 복습 ~!
반응형
'백준알고리즘' 카테고리의 다른 글
[Java][정렬] 백준 1026 보물 (0) | 2021.04.27 |
---|---|
백준 1717 집합의 표현 Union-Find JAVA (0) | 2020.07.10 |
백준 숫자판 점프 2210 JAVA DFS (0) | 2020.07.07 |
백준 계란으로 계란치기 16987번 JAVA DFS (0) | 2020.07.07 |
백준 로또 6603번 JAVA DFS 순환 (0) | 2020.07.06 |
댓글