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 |
Tags
- Matplotlib
- FDS
- 코딩테스트
- docker
- 알고리즘
- Kaggle
- wandb
- 백준
- torchserve
- NLP
- Kubernetes
- GCP
- rnn
- GitHub Action
- GIT
- pytorch
- autoencoder
- 완전탐색
- DeepLearning
- 네이버AItech
- PytorchLightning
- pep8
- github
- NaverAItech
- leetcode
- FastAPI
- datascience
- 프로그래머스
- vscode
- python
Archives
- Today
- Total
Sangmun
최소신장트리(MST) 본문
https://ongveloper.tistory.com/376
최소신장트리에 사용되는 크루스칼 알고리즘과 프림알고리즘을 알아보았다.
설명은 위의 블로그에서 너무 잘 설명해주셔서 내가 구지 더 할 필요는 없을것 같다.
파이썬 코드가 없어서 파이썬 코드를 추가해보았다.
1. 크루스칼 알고리즘
# 출처 '이것이 취업을 위한 코딩테스트다'
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
v, e = map(int, input().split())
parent = [0] * (v+1)
edges = []
result = 0
for i in range(1, v+1):
parent[i] = i
for _ in range(e):
a, b, cost = map(int,input().split())
edges.append((cost,a,b))
edges.sort()
for edge in edges:
cost, a, b = edge
if find_parent(parent,a) != find_parent(parent,b):
union_parent(parent,a,b)
result += cost
print(result)
2. 프림 알고리즘
# 출처 : https://deep-learning-study.tistory.com/595
import heapq
import collections
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
n, m = map(int,input().split()) # 노드 수, 간선 수
graph = collections.defaultdict(list) # 빈 그래프 생성
visited = [0] * (n+1) # 노드의 방문 정보 초기화
# 무방향 그래프 생성
for i in range(m): # 간성 정보 입력 받기
u, v, weight = map(int,input().split())
graph[u].append([weight, u, v])
graph[v].append([weight, v, u])
# 프림 알고리즘
def prim(graph, start_node):
visited[start_node] = 1 # 방문 갱신
candidate = graph[start_node] # 인접 간선 추출
heapq.heapify(candidate) # 우선순위 큐 생성
mst = [] # mst
total_weight = 0 # 전체 가중치
while candidate:
weight, u, v = heapq.heappop(candidate) # 가중치가 가장 적은 간선 추출
if visited[v] == 0: # 방문하지 않았다면
visited[v] = 1 # 방문 갱신
mst.append((u,v)) # mst 삽입
total_weight += weight # 전체 가중치 갱신
for edge in graph[v]: # 다음 인접 간선 탐색
if visited[edge[2]] == 0: # 방문한 노드가 아니라면, (순환 방지)
heapq.heappush(candidate, edge) # 우선순위 큐에 edge 삽입
return total_weight
print(prim(graph,1))
3. 크루스칼 vs 프림
크루스칼의 시간 복잡도는 O(ElogE)
프림의 시간 복잡도 O(ElogV)
Comments