https://www.acmicpc.net/problem/1976
1976번: 여행 가자
동혁이는 친구들과 함께 여행을 가려고 한다. 한국에는 도시가 N개 있고 임의의 두 도시 사이에 길이 있을 수도, 없을 수도 있다. 동혁이의 여행 일정이 주어졌을 때, 이 여행 경로가 가능한 것인
www.acmicpc.net
분류 : DisJoint-Set
더보기
import java.io.*;
import java.math.*;
import java.util.*;
class MyScanner {
BufferedReader br;
StringTokenizer st;
public MyScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
}
public class Main {
static PrintWriter out;
//root[a] = b -> a의 부모는 b이다.
static int[] root = new int[1001];
public static void main(String[] args) throws IOException {
MyScanner sc = new MyScanner();
out = new PrintWriter(new BufferedOutputStream(System.out));
int N = sc.nextInt();
int M = sc.nextInt();
// root 초기화
for (int i = 1; i <= N; i++)
{
root[i] = i;
}
for(int A = 1;A<=N;A++)
{
for(int B = 1;B<=N;B++)
{
int num =sc.nextInt();
if(num ==1)
{
Union(A,B);
}
}
}
int ex = sc.nextInt();
int Test =Find(ex);
String str = "YES";
for(int i=0;i<M-1;i++)
{
int T = sc.nextInt();
T=Find(T);
if(T!=Test)
{
str= "NO";
break;
}
}
out.println(str);
out.flush();
}
private static void Union(int a, int b) {
a = Find(a);
b = Find(b);
if (a != b) {
root[a] = b;
}
}
private static int Find(int k) {
//루트 노드 이면 return k
if (k == root[k])
return k;
//그 외에는 자신의 루트를 찾으러 간다.
return root[k] = Find(root[k]);
}
}
1717번 : 집합의 표현과 마찬가지로 Union-Find 알고리즘을 이해하기에 좋은 문제
마지막 줄 여행 계획 비교 하는 부분만 주의하면 1717번 문제와 기본 틀은 거의 비슷하다.
'PS' 카테고리의 다른 글
[BOJ]10974번 : 모든 순열 (0) | 2017.03.29 |
---|---|
[BOJ]11657번 : 타임 머신 (0) | 2017.03.28 |
[BOJ]4195번 : 친구 네트워크 (0) | 2017.03.25 |
[BOJ]1717번 : 집합의 표현 (0) | 2017.03.25 |
[BOJ]1788번 : 피보나치 수의 확장 (0) | 2017.03.24 |