
그래프에서 두 정점 사이의 가장 짧은 거리(비용)를 구하는 문제
대표 알고리즘
아이디어
“가까운 정점부터 하나씩 확정”하는 탐욕적(Greedy) 알고리즘
핵심 구조:
dist[]: 시작점에서의 최단 거리 테이블수도코드
dist[] = INF
dist[start] = 0
PQ = (0, start)
while PQ not empty:
d, u = PQ.pop()
if d > dist[u]: continue
for (v, w) in adj[u]:
if dist[v] > d + w:
dist[v] = d + w
PQ.push((dist[v], v))
파이썬 구현
import heapq
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
start = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(M):
u, v, w = map(int, input().split())
graph[u].append((v, w))
INF = int(1e9)
dist = [INF]*(N+1)
def dijkstra(s):
dist[s] = 0
pq = [(0, s)]
while pq:
d, u = heapq.heappop(pq)
if d > dist[u]: # 이미 더 짧은 거리로 확정된 경우 skip
continue
for v, w in graph[u]:
if dist[v] > d + w:
dist[v] = d + w
heapq.heappush(pq, (dist[v], v))
dijkstra(start)
for i in range(1, N+1):
print(dist[i] if dist[i] != INF else "INF")
개념
그래프의 모든 정점을 사이클 없이 연결하는 최소 비용 부분 그래프
간선 수는 항상
대표 알고리즘
아이디어
여러 원소들을 “집합 단위”로 관리하는 자료구조
핵심 연산
기본 구조
parent = [i for i in range(N+1)]
def find(x):
if parent[x] != x:
parent[x] = find(parent[x]) # 경로 압축(Path Compression)
return parent[x]
def union(a, b):
ra, rb = find(a), find(b)
if ra != rb:
if ra < rb: parent[rb] = ra # union by rank/size 가능
else: parent[ra] = rb
특징
아이디어
코드
edges = []
for _ in range(M):
u, v, w = map(int, input().split())
edges.append((w, u, v))
edges.sort()
parent = [i for i in range(N+1)]
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
def union(a, b):
ra, rb = find(a), find(b)
if ra != rb:
if ra < rb: parent[rb] = ra
else: parent[ra] = rb
return True
return False
mst_cost = 0
for w, u, v in edges:
if union(u, v): # 사이클 없는 간선만 선택
mst_cost += w
print(mst_cost)
아이디어
코드
import heapq
def prim(start, graph, N):
visited = [False]*(N+1)
pq = [(0, start)] # (비용, 정점)
total = 0
count = 0
while pq and count < N:
w, u = heapq.heappop(pq)
if visited[u]: continue
visited[u] = True
total += w
count += 1
for v, cost in graph[u]:
if not visited[v]:
heapq.heappush(pq, (cost, v))
return total
| 알고리즘 | 목적 | 탐색 방식 | 자료구조 | 특징 |
|---|---|---|---|---|
| Dijkstra | 최단 경로 | 가까운 정점부터 거리 확정 | PQ(힙) | 가중치 양수 |
| Kruskal | MST | 간선 정렬 + 유니온 파인드 | 정렬 + DSU | 희소 그래프 유리 |
| Prim | MST | PQ로 정점 확장 | PQ(힙) | 밀집 그래프 유리 |
다익스트라
MST