-
[백준 9372번] 상근이의 여행Coding Test/백준 2021. 2. 20. 21:49
# 문제
내 풀이 1
import sys input = sys.stdin.readline # 루트 노드를 찾는 연산을 정의 def find_parent(parent, x): if parent[x] != x: parent[x] = find_parent(parent, parent[x]) return parent[x] # 두 원소가 속한 집합을 합치는 연산 정의 def union_parent(parent, a, b): a = find_parent(parent, a) b = find_parent(parent, b) if a < b: parent[b] = a else: parent[a] = b t = int(input()) for _ in range(t): n, m = map(int, input().split()) parent = [i for i in range(n + 1)] cnt = 0 # 신장 트리에 포함되는 간선의 수 for _ in range(m): a, b = map(int, input().split()) # 사이클이 생기지 않는 경우 해당 간선을 신장트리에 포함시킴 if find_parent(parent, a) != find_parent(parent, b): union_parent(parent, a, b) cnt += 1 print(cnt)
내 풀이 2
import sys input = sys.stdin.readline t = int(input()) for _ in range(t): n, m = map(int, input().split()) for _ in range(m): a, b = map(int, input().split()) print(n - 1) # 신장트리의 간선 개수는 (전체 노드의 개수 - 1)
생각해볼 점
최소 신장 트리 문제는 아니고 단순한 신장 트리를 구하는 문제였다. 그러다보니 문제에서 의도하는 방향은 내 풀이 1번일텐데, 내 풀이 2번처럼 신장 트리의 특성을 사용해 간단하게 풀 수도 있었다. 신장 트리의 간선 수는 (모든 노드의 개수 - 1)이기 때문에, 사실 무언가 알고리즘 설계 없이도 답은 구할 수 있다.
'Coding Test > 백준' 카테고리의 다른 글
[백준 4386번] 별자리 만들기 (0) 2021.02.22 [백준 1197번] 최소 스패닝 트리 (0) 2021.02.21 [백준 20040번] 사이클 게임 (0) 2021.02.18 [백준 4195번] 친구 네트워크 (0) 2021.02.17 [백준 1976번] 여행 가자 (0) 2021.02.16