λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⭐ Personal_Study/Algorithm

[μ•Œκ³ λ¦¬μ¦˜] μ΅œμ†Œ μ‹ μž₯ 트리 (MST)

by ν¬μŠ€νŠΈμ‰μ΄ν¬ 2022. 9. 29.

μ΅œμ†Œ μ‹ μž₯ 트리 (MST)

μ‹ μž₯ 트리 (Spanning Tree)

image


βœ” κ·Έλž˜ν”„ λ‚΄μ˜ λͺ¨λ“  정점을 ν¬ν•¨ν•˜λŠ” 트리
βœ” κ·Έλž˜ν”„μ˜ μ΅œμ†Œ μ—°κ²° λΆ€λΆ„ κ·Έλž˜ν”„ (N - 1)개의 κ°„μ„  -> 트리 ν˜•νƒœ

μ΅œμ†Œ μ‹ μž₯ 트리 (Minimum spanning Tree)

mst


βœ” Spanning Tree μ€‘μ—μ„œ κ°„μ„ μ˜ κ°€μ€‘μΉ˜ 합이 μ΅œμ†Œ(Minimun)인 트리

multiple mst


βœ” μ΅œμ†Œ μ‹ μž₯ νŠΈλ¦¬λŠ” μ—¬λŸ¬ 개 일 수 μžˆλ‹€.

MST κ΅¬ν˜„ - 크루슀칼 μ•Œκ³ λ¦¬μ¦˜

βœ” Greedyλ₯Ό μ΄μš©ν•΄ 각 λ‹¨κ³„μ—μ„œ 사이클을 이루지 μ•ŠλŠ” μ΅œμ†Œ λΉ„μš© 간선을 μ„ νƒν•œλ‹€.

λ™μž‘ μˆœμ„œ

image
  1. 간선을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€. (μ΅œμ†Œ λΉ„μš©)
  2. μ •λ ¬λœ κ°„μ„  λ¦¬μŠ€νŠΈμ—μ„œ μˆœμ„œλŒ€λ‘œ 사이클을 ν˜•μ„±ν•˜μ§€ μ•ŠλŠ” 간선을 μ„ νƒν•œλ‹€.
    (Union - Find 이용: Union-Find μ•Œκ³ λ¦¬μ¦˜μ΄λž€?!)
  3. μ„ νƒν•œ 간선을 ν˜„μž¬ MST집합에 μΆ”κ°€ν•œλ‹€.

μ†ŒμŠ€ μ½”λ“œ

# V: 정점 개수, E: κ°„μ„  개수
V, E = map(int, input().split())
# parent: λΆ€λͺ¨ ν…Œμ΄λΈ” (자기 μžμ‹ μœΌλ‘œ μ΄ˆκΈ°ν™”)
parent = [i  for  i  in  range(V + 1)]


# find ν•¨μˆ˜
def  find(x):
	if  parent[x] != x:
		parent[x] = find(parent[x])
	return  parent[x]
   
   
# union ν•¨μˆ˜
def  merge(x, y):
	x = find(x)
	y = find(y)
	
	if  x < y:
		parent[y] = x
	else:
		parent[x] = y

	return


# edges: κ°„μ„  정보λ₯Ό 담을 리슀트, total_cost: μ΅œμ†Œ μ‹ μž₯ 트리의 κ°€μ€‘μΉ˜ 합계
edges = []
total_cost = 0

# κ°„μ„  정보 μž…λ ₯
for  _  in  range(E):
	node1, node2, cost = map(int, input().split())
	edges.append((cost, node1, node2))  

# κ°€μ€‘μΉ˜ κΈ°μ€€μœΌλ‘œ μ •λ ¬
edges.sort()
   
# 각 간선에 λŒ€ν•΄ μœ λ‹ˆμ˜¨-νŒŒμΈλ“œλ‘œ cylce μ—¬λΆ€ νŒλ‹¨ν•˜μ—¬ 크루슀칼 μ•Œκ³ λ¦¬μ¦˜ μˆ˜ν–‰
for  i  in  range(E):
	cost, node1, node2 = edges[i]
	# λΆ€λͺ¨ λ…Έλ“œκ°€ λ‹€λ₯΄λ©΄ cylceν•˜μ§€ μ•Šλ‹€
	if  find(node1) != find(node2):
		# mst에 포함
		merge(node1, node2)
		# κ°€μ€‘μΉ˜ 계산
		total_cost += cost  

# κ°€μ€‘μΉ˜ 합계 좜λ ₯
print(total_cost)

'⭐ Personal_Study > Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Segment Tree  (0) 2022.12.03
[μ•Œκ³ λ¦¬μ¦˜] λ‹€μ΅μŠ€νŠΈλΌ (Dijkstra)  (0) 2022.10.01
[μ•Œκ³ λ¦¬μ¦˜] Union-Find  (1) 2022.09.28

λŒ“κΈ€