deck:: Logseq/coding tip

- ## 1. 개념(Concept)
	- 최소 스패닝 트리(MST)를 구하는 알고리즘.
	- “임의의 시작 정점에서 출발하여, 현재 트리에 연결된 간선 중 가장 싼 것을 추가하며 확장한다.” 라는 전략을 사용
		- 이를 위해 {{cloze 우선순위 큐}}가 사용됨.
		  id:: 69511108-8006-4c0a-9452-d248f8c58ca5
		- [[다익스트라 알고리즘 (Dijkstra Algorithm)]]과 비슷함.
- ## 2. 동작 원리 (Algorithm Flow)
	- 1) 임의의 정점(vertex)을 하나 선택해서 트리에 포함시킨다.
	- 2) 현재 트리에 포함된 정점들과 포함되지 않은 정점들을 연결하는 간선 중, 가중치가 가장 작은 간선을 찾는다.
	- 3) 해당 간선과 연결된 새로운 정점을 트리에 추가한다.
	- 4) 위의 과정을 반복하여 최종적으로 모든 정점이 트리에 포함될 때 까지 반복한다.
- ## 3. 코드(python)
	- 입력이 V(정점의 갯수), 인접리스트(graph)와 시작노드(start_node)를 매개변수로 하여
	  id:: 695111c8-84a0-4220-a7f4-b9f654761cec
	  프림 알고리즘으로 최소 스패닝 트리를 구현하고,
	  이때 총 가중치를 반환하는 함수를 구현하면?
	  ```python
	  # graph: (노드: [(비용, 인접노드)]...)
	  # ex) graph = [[],[(3,2),(4,5)],[(1,3)]...]
	  ```
	  #card
		- ```python
		  import heapq
		  
		  # graph: 인접 리스트 (노드: [(비용, 인접노드), ...])
		  def prim(start_node, v, graph):
		      visited = [False] * (v + 1)
		      min_heap = [(0, start_node)] # (비용, 정점)
		      total_cost = 0
		      count = 0
		      
		      while min_heap:
		          cost, node = heapq.heappop(min_heap)
		          
		          if visited[node]:
		              continue
		              
		          visited[node] = True
		          total_cost += cost
		          count += 1
		          
		          if count == v: # 모든 정점 방문 완료
		              break
		              
		          # 인접 정점 중 방문 안 한 곳을 큐에 넣기
		          for next_cost, next_node in graph[node]:
		              if not visited[next_node]:
		                  heapq.heappush(min_heap, (next_cost, next_node))
		                  
		      return total_cost
		  ```
- ## 4. 시간복잡도
	- 우선순위큐 연산이 주된 연산이므로 우선순위 큐 연산 속도에 영향을 많이 받음.
	- 시간복잡도는 {{cloze $O(E\log V)$}}
	  id:: 69511407-a9bc-40f2-b57c-f76060ea75f1