1717번: 집합의 표현
첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는
www.acmicpc.net
Kruskal 알고리즘을 이용하자
- 모든 수가 처음에 자기 자신을 root로 가지는 root배열을 생성한다.
- findRoot함수를 통해 입력받은 두 수의 root를 찾는다.
- q가 0이면 두 root를 비교하여 출력한다.
- q가 1이면 더 큰 root의 root를 작은 root로 바꾸어준다.
import sys sys.setrecursionlimit(10**6) input = sys.stdin.readline N, M = map(int, input().split()) root = [i for i in range(N+1)] def findRoot(x): if root[x] != x: root[x] = findRoot(root[x]) return root[x] for _ in range(M): q, a, b = map(int, input().split()) aRoot = findRoot(a) bRoot = findRoot(b) if q: if aRoot == bRoot: print("YES") else: print("NO") else: if aRoot < bRoot: root[bRoot] = aRoot else: root[aRoot] = bRoot
'개발 > 알고리즘' 카테고리의 다른 글
[백준 1922] 네트워크 연결 (python) (0) | 2021.05.04 |
---|---|
[백준 2252] 줄 세우기 (python) (0) | 2021.05.03 |
[백준 2493] 탑 (python) (0) | 2021.05.01 |
[프로그래머스] 경주로 건설 (python) (0) | 2021.05.01 |
[프로그래머스] 보석 쇼핑 (python) (0) | 2021.04.30 |
최근댓글