문제링크 : www.acmicpc.net/problem/1976
여행지가 연결되었는 지만 알면 되기 때문에 disjoint set으로 해결 가능하다.
import java.io.*;
import java.util.*;
public class Main {
public static int N,M;
public static int [][]adj;
public static int par[];
public static void init() {
for(int i=1;i<=N;i++) {
par[i] = i;
}
}
public static int find(int x) {
if(par[x] == x) return x;
return par[x] = find(par[x]);
}
public static void union(int x,int y) {
int a= find(x);
int b = find(y);
if(a!=b) {
par[a] = b;
}
}
public static void allUnion() {
for(int i=1;i<=N;i++) {
for(int j=1;j<=N;j++) {
if(i==j) continue;
if(adj[i][j]==1) {
union(i,j);
}
}
}
}
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
adj = new int[N+1][N+1];
par = new int[N+1];
init();
StringTokenizer st;
for(int i=1;i<=N;i++) {
st = new StringTokenizer(br.readLine());
for(int j=1;j<=N;j++) {
adj[i][j] = Integer.parseInt(st.nextToken());
}
}
allUnion();
st = new StringTokenizer(br.readLine());
int query[] = new int[M];
for(int i=0;i<M;i++) {
query[i] = Integer.parseInt(st.nextToken());
}
boolean suc = true;
for(int i=0;i<M-1;i++) {
if(find(query[i])!=find(query[i+1])) {
suc = false;
break;
}
}
if(suc) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2169 로봇 조종하기[JAVA] (5) | 2021.02.24 |
---|---|
[백준] 14267 회사 문화1 (0) | 2021.02.15 |
[백준] 1963 소수 경로 (0) | 2021.02.15 |
[백준] 1744 수 묶기 (0) | 2021.02.15 |
[백준] 14226 이모티콘 [JAVA] (0) | 2021.02.15 |