Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 제네릭
- 버퍼비우기
- 추상 클래스
- 열거형
- 상속
- 프림알고리즘
- nextInt
- java
- 객체 지향
- 와일드카드
- 다형성
- abstract
- 내부 클래스
- Final
- 객체지향
- enum
- 추상화
- Scanner
- 인터페이스
- polymorphism
- 17472
- 캡슐화
- 최소신장트리
- this
- inheritance
- python
- 백준
- 생성자
- Encapsulation
Archives
- Today
- Total
쫑쫑이의 블로그
백준 1976 여행 가자 Java [분리집합, Union find] 본문
https://www.acmicpc.net/problem/1976
분리 집합 문제로 여행 계획에 있는 모든 도시들이 하나의 집합에 속해 공통 부모를 가지고 있는지 확인하면 된다
입력에서 1이 나온 부분을 i번째 도시와 j번째 도시를 부모가 같게 만든다
i번째 도시의 i보다 작은 숫자의 도시들은 이전에 중복 체크되니까 j의 시작을 i + 1로 하면 시간을 절반으로 단축할 수 있다
예제의 경우 그림에 빨간 선으로 표현한 것처럼 3번만 확인하면 된다
import java.io.*;
import java.util.*;
public class Main {
static int[] parents;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
parents = new int[N+1];
for (int n = 1; n <= N; n++) parents[n] = n;
for (int i = 0; i < N; i++) {
int[] cities = getArr(br.readLine());
for (int j = i + 1; j < N; j++) {
if (cities[j] == 0) continue;
union(i + 1, j + 1);
}
}
int[] plan = getArr(br.readLine());
String result = "YES";
int parent = find(plan[0]);
for (int m = 1; m < M; m++) {
if (parent != find(plan[m])) {
result = "NO";
break;
}
}
System.out.println(result);
}
static int[] getArr(String str) {
return Arrays.stream(str.split(" ")).mapToInt(Integer::parseInt).toArray();
}
static int find(int x) {
if (parents[x] == x) return x;
return parents[x] = find(parents[x]);
}
static void union(int x, int y) {
int px = find(x);
int py = find(y);
if (px != py) parents[px] = py;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 1516 게임 개발 Java [위상정렬, DP] (0) | 2022.11.25 |
---|---|
백준 11085 군사 이동 Java [분리집합 Union find] (0) | 2022.11.24 |
백준 1717 집합의 표현 Java [분리집합, Union find] (0) | 2022.11.22 |
백준 10986 나머지 합 Java [누적합] (0) | 2022.11.21 |
백준 1655 가운데를 말해요 Java [우선순위 큐] (0) | 2022.11.20 |