:) 주의할 점
🔔 Greedy 알고리즘의 정당성
🔔 Greedy 알고리즘 수행 과정
1. 해 선택
- 현재 상태에서 부분 문제의 최적 해를 구한 뒤, 이를 부분 해 집합에 추가함
2. 실행 가능성 검사
- 새로운 부분 해 집합이 실행 가능한지 확인. 문제의 제약 조건을 위반하지 않는지 검사
3. 해 검사
- 새로운 부분 해 집합이 문제의 해가 되는지 확인
- 전체 문제의 해가 완성되지 않았다면 1번 과정부터 다시 시작함
🔔 Dijkstra(다익스트라) 알고리즘
동작 설명
1. 거리, 방문 테이블 준비 (거리 테이블 : INF, 방문 테이블 : False로 모두 초기화)
2. 시작 노드 선택 (방문 처리)
3. 연결되어 있는 노드와의 최단 거리를 구함 (거리 테이블 갱신)
4. 갱신 후 아직 방문하지 않은 노드 중 가장 거리가 짧은 노드를 선택 (방문 처리)
5. 3~4번 과정 반복
순차 탐색 구현
def min_node(): # 탐색 이력이 없고 최단경로가 최솟값인 노드 반환
min_n = INF
node = 0
for i in range(1, node_cnt + 1): # 탐색이력이 없는 최단 경로를 가진 노드 탐색
if dis[i] < min_n and not visited[i]:
min_n = dis[i]
node = i
return node
def dijkstra(start):
dis[start] = 0
visited[start] = True
for i in range(1, node_cnt + 1):
if graph[start][i] != 0:
dis[i] = graph[start][i]
for i in range(node_cnt - 1):
min_node = min_node()
visited[min_node] = True
for j in range(1, node_cnt + 1):
if graph[min_node][j] != 0 and dis[min_node] + graph[min_node][j] < dis[j]:
dis[j] = dis[min_node] + graph[min_node][j]
우선순위 큐 구현
import heapq
import sys
INF = int(1e9)
n, m = map(int, input().split())
start = int(input())
graph = [[] for _ in range(n+1)] # 그래프
distance = [INF]*(n+1) # 최단 경로 테이블
for _ in rnage(m): # 간선 초기화
node, target, cost = map(int, input().split())
graph[node].append((target, cost))
def dijkstra(start):
q = []
heapq.heappush(q, (0, start))
distance[start] = 0 # 최단경로 테이블 최적해 갱신
while q:
cost, node = heapq.heappop(q) # (비용, 현재 노드)
if distance[node] < cost : continue # 이미 방문한 노드인 경우
for next in graph[node]:
next_cost = next[1] + cost
if next_cost < distance[next[0]]:
distance[next[0]] = next_cost # 최단경로 테이블 최적해로 갱신
heapq.heappush(q, (next_cost, next[0]))
dijkstra(start)