백준 1197번 최소 스패닝 트리 문제를 풀면서 학습한 최소 스패닝 트리에 대해 기록으로 남겨놓으려 한다. 다익스트라부터 공부하긴 해야하는데...
주의!!!!
참고한 블로그 글을 다시 보기 위함도 있고 나 스스로 이해한 부분을 다시 체크하는 거라 틀린 내용이 있을 수 있다.
https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
최소 스패닝 트리 (MST; Minimum Spanning Tree)란?
- 간선이 가장 적은 그래프
- n개의 정점과 (n-1)개의 간선으로 이루어진 트리
- 트리의 특수한 형태로 사이클이 존재하지 않는다.
MST 구현 방법
1. 크루스칼 알고리즘
그리디 알고리즘의 일종으로 가중치의 값이 가장 작은 값부터 선택해 모든 정점을 최소 비용으로 연결해 최적의 답을 구하는 알고리즘
- 그래프의 간선을 가중치의 오름차순 정렬
- 가중치가 가장 적은 값부터 선택하는데 이 때 사이클이 존재하지 않을 경우에만 선택한다.
- 사이클이 존재하는지 확인하는 방법 나는 유니온 파인드 알고리즘을 사용했다. - 선택한 간선을 MST 집합에 추가
사이클이 존재하는지 확인하기
1) 무향 그래프인 경우
① Stack
② Union-Find
여러 노드가 존재할 때, 어떤 노드를 같은 집합으로 묶어주고, 다시 어떤 두 노드가 같은 집합에 있는지 확인하는 알고리즘으로 Union 연산과 Find 연산으로 나누어진다.
Union 연산
# 두 원소가 속한 집합을 합치기
def union(a, b):
a = find(a)
b = find(b)
if a < b:
parent[b] = a
else:
parent[a] = b
Find 연산
# 특정 원소가 속한 집합을 찾기
def find(x):
# 루트 노드가 아니라면, 루트 노드를 찾을 때까지 재귀적으로 호출
if parent[x] != x:
return find(parent[x])
return x
2) 유향 그래프인 경우
visited 배열, finished 배열
https://sosoeasy.tistory.com/35
그래프에 사이클이 있는지 확인하는방법
dfs(stack)를 이용하여 그래프에서 사이클이 있는지 확인할 수 있다. 이때 그래프가 유향일때와 무향일때 방법이 각각 다르다. 1. 무향그래프 (1) stack #싸이클인지 확인 def isCycle(L): visitedN=[] myL=li
sosoeasy.tistory.com
2. 프림 알고리즘
선택해야하는 간선의 개수가 너무 많을 때 사용하는 알고리즘으로 다익스트라 알고리즘과 유사하다.
1. 임의의 정점을 선택하고,(정렬X)
2. 해당 정점에서 갈 수 있는 간선을 min heap에 넣는다.
3. 최소값을 뽑아 해당 정점을 방문 안했다면 선택한다.
출처:
https://gmlwjd9405.github.io/2018/08/28/algorithm-mst.html
https://sosoeasy.tistory.com/35
https://hillier.tistory.com/54
그래프에 사이클이 있는지 확인하는방법
'Algorithms' 카테고리의 다른 글
[알고리즘] 윤년 계산하기 (0) | 2023.07.09 |
---|---|
[백준] 과자 나눠주기 (0) | 2023.03.07 |