일단 처음에 문제가 잘 이해가 가지 않아서 오래 걸렸다..
도시의 개수 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");
}
}
'스터디 > Algorithm' 카테고리의 다른 글
[백준] 휴게소 세우기 1477 java - 이분탐색 (0) | 2024.10.14 |
---|---|
[백준] 괄호 추가하기 16637 java - dfs (0) | 2024.10.10 |
[프로그래머스스쿨] 체육복 java - greedy (0) | 2024.09.25 |
[프로그래머스스쿨] 그룹별 조건에 맞는 식당 목록 출력하기 oracle (1) | 2024.09.20 |
[프로그래머스스쿨] 입양 시각 구하기(2) oracle (1) | 2024.09.20 |