임의의 도시 N개가 있고, 이 도시들은 연결되있을수도 있고 아닐수도 있다. 도시들은 직접적으로 연결되어있지 않아도 건너 건너 갈 수도 있다. 이때 동혁이가 짠 여행경로가 주어졌을 때 여행이 가능한지 여부를 출력하면 된다.
union find
로 해결했다.
connection()
은 두 도시의 값을 입력받아서 그들의 부모 값을 구한다.getParent()
: 재귀 호출로 상위 부모를 찾는다.check()
로 여행 경로가 가능한지 여부를 확인한다.import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_1976 {
static int[] parent;
static int[][] city;
static int[] route;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
int m = Integer.parseInt(br.readLine());
parent = new int[n + 1];
route = new int[m];
city = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
parent[i] = i;
st = new StringTokenizer(br.readLine());
for (int j = 1; j <= n; j++) {
city[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
for (int i = 0; i < m; i++) {
route[i] = Integer.parseInt(st.nextToken());
}
/* 도시 연결 */
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (city[i][j] == 1) {
connection(parent, i, j);
}
}
}
if (check(parent, route)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
static int getParent(int[] parent, int a) {
if (parent[a] == a) {
return parent[a];
} else {
return parent[a] = getParent(parent, parent[a]);
}
}
static void connection(int[] parent, int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
if (a < b) {
parent[b] = a;
} else {
parent[a] = b;
}
}
static boolean check(int[] parent, int[] route) {
for (int i = 0; i < route.length; i++) {
if (parent[route[0]] != parent[route[i]]) {
return false;
}
}
return true;
}
}
탐색 시간을 줄이겠답시고 도시 연결 부분에서
/* 도시 연결 */
for (int i = 1; i <= n; i++) {
for (int j = i+1; j <= n; j++) {
if (city[i][j] == 1) {
connection(parent, i, j);
}
}
}
대각선 윗 부분으로만 연결을 하려고 했다.
이렇게 했을 경우 1-2, 3-4가 연결되어 있는 상황에서 추가로 2-3을 연결 할 때 4의 부모값은 바뀌지 않게된다!
그래서 모든 값을 연결하면서 부모값을 update 해줄 수 있도록 변경했다