스터디/Algorithm
[백준] 여행 가자 1976 java - union find
혜유우
2024. 10. 2. 02:09
일단 처음에 문제가 잘 이해가 가지 않아서 오래 걸렸다..
도시의 개수 N이 연결되어 있는지의 대한 정보가 N*N개 입력,
여행 계획에 대한 정보를 M개 입력하는 것이다..
또한 순간 착각해서 A->B, B->A를 같은 경우로 생각해서 ArrayList에 양방향으로 추가해줬는데..
다른 경우이므로 따로 List에 추가해주지 않아도 된다 !!
이 문제는 bfs로 풀이해도 되지만
union-find 알고리즘으로 푸는 게 더 수월하다 !
https://www.acmicpc.net/problem/1976
import java.io.*;
import java.util.*;
public class Main {
static int N, M;
static int[] parent;
static void union(int x, int y){
x = find(x);
y = find(y);
if(x>y) parent[x] = y;
else parent[y] = x;
}
static int find(int x){
if(x==parent[x])
return x;
return parent[x] = find(parent[x]);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
parent = new int[N+1];
for(int i=1;i<=N;i++){
parent[i] = i;
}
for(int i=1;i<=N;i++){
st = new StringTokenizer(br.readLine());
for(int j=1;j<=N;j++) {
int possible = Integer.parseInt(st.nextToken());
if (possible == 1) {
union(i, j);
}
}
}
int[] city = new int[M+1];
st = new StringTokenizer(br.readLine());
for(int i=1;i<=M;i++){
city[i] = Integer.parseInt(st.nextToken());
}
boolean flag = true;
for(int i=1;i<=M-1;i++){
if(parent[city[i]]!=parent[city[i+1]]){
flag = false;
break;
}
}
if(flag)
System.out.println("YES");
else
System.out.println("NO");
}
}