🙋🏻♀️ 유니온 파인드 활용!
도시의 연결 유무를 유니온 파인드 연산을 이용해 해결할 수 있다는 아이디어 떠올리기!
일반적으로 유니온 파인드는 그래프 영역에서 많이 활용되지만, 이 문제와 같이 단독으로도 활용할 수 있다.
도시간 연결 데이터를 인접 행렬 형태로 주었기 때문에 인접 행렬을 탐색하면서 연결될 때마다 union연산 수행
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.ArrayList;
public class Main {
static int[] parent;
static int[][] city;
public static void main(String[] args) throws IOException {
String answer = "YES";
ArrayList<Integer> trip = new ArrayList<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
city = new int[N+1][N+1];
parent = new int[N+1];
for(int i=1; i<=N; i++) {
parent[i] = i;
}
for(int i=1; i<=N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=1; j<=N; j++) {
if(Integer.parseInt(st.nextToken()) == 1) union(i,j);
}
}
StringTokenizer st = new StringTokenizer(br.readLine());
while(st.hasMoreTokens()) {
trip.add(Integer.parseInt(st.nextToken()));
}
int check = find(trip.get(0));
for(int i=1; i<trip.size(); i++) {
if(find(trip.get(i)) != check) {
answer = "NO";
break;
}
}
System.out.println(answer);
}
public static int find(int x) {
if(parent[x] == x) return x;
int y= find(parent[x]);
parent[x] = y;
return y;
}
public static void union(int x, int y) {
x = find(x);
y = find(y);
if(x == y) return;
parent[y] = x;
}
}