https://www.acmicpc.net/problem/1976
도시들의 연결된 것을 파악해야하는 문제이기 때문에 유니온 파인드로 풀이했다.
import java.util.*;
import java.io.*;
public class 여행가자 {
static int N, M;
static int[] parent, rank;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
parent = new int[N+1];
rank = new int[N+1];
// makeset
for(int i = 1; i <= N; i++) {
parent[i] = i;
rank[i] = 1;
}
for(int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 1; j <= N; j++) {
if(Integer.parseInt(st.nextToken())==1) union(i,j);
}
}
st = new StringTokenizer(br.readLine());
int city = find(Integer.parseInt(st.nextToken()));
boolean isConnect = true;
for(int i = 0; i < M-1; i++) {
if(city == find(Integer.parseInt(st.nextToken()))) continue;
else isConnect = false;
}
if(isConnect) System.out.println("YES");
else System.out.println("NO");
}
private static void union(int i, int j) {
int pi = find(i);
int pj = find(j);
if(rank[pi] >= rank[pj]) {
rank[pi] += rank[pj];
parent[pj] = pi;
}else {
rank[pj] += rank[pi];
parent[pi] = pj;
}
}
private static int find(int i) {
if(parent[i]==i) return i;
return i = find(parent[i]);
}
}
'코딩테스트' 카테고리의 다른 글
백준 알고스팟 (0) | 2024.11.29 |
---|---|
[백준 10425] 피보나치 인버스 (0) | 2024.11.05 |
[백준 10164] 격자상의 경로 (0) | 2024.11.05 |
[알고리즘] 인덱스 트리 (2) | 2024.11.05 |
[알고리즘] 트리를 사용해서 구간합 구하기 (0) | 2024.10.22 |