최단 거리는 두 지점 사이의 가장 짧은 경로를 찾는 문제입니다. 그래프에서 각 간선 또는 엣지에 가중치가 부여되어 있을 때, 최단 거리를 찾는 문제는 너비 우선 탐색(BFS), 다익스트라 알고리즘, 벨만-포드 알고리즘 등을 사용하여 해결할 수 있습니다.
최단 거리 문제의 주요 특징:
최단 거리의 활용 예시:
파이썬 코드를 통해 최단 거리 알고리즘을 예시로 살펴보겠습니다. 다음은 그래프에서 다익스트라 알고리즘을 사용하여 단일 출발점에서 모든 정점까지의 최단 거리를 구하는 코드입니다.
import heapq
def dijkstra(graph, start):
distances = {vertex: float('infinity') for vertex in graph}
distances[start] = 0
priority_queue = [(0, start)]
while priority_queue:
current_distance, current_vertex = heapq.heappop(priority_queue)
if current_distance > distances[current_vertex]:
continue
for neighbor, weight in graph[current_vertex].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(priority_queue, (distance, neighbor))
return distances
# 그래프의 인접 리스트 표현
graph = {
'A': {'B': 1, 'C': 4},
'B': {'A': 1, 'C': 2, 'D': 5},
'C': {'A': 4, 'B': 2, 'D': 1},
'D': {'B': 5, 'C': 1}
}
start_vertex = 'A'
shortest_distances = dijkstra(graph, start_vertex)
print("출발점", start_vertex, "에서의 최단 거리:")
for vertex, distance in shortest_distances.items():
print(f"{vertex}: {distance}")
이 코드는 그래프에서 다익스트라 알고리즘을 사용하여 단일 출발점에서 모든 정점까지의 최단 거리를 구하는 예시입니다. 우선순위 큐(Heap)를 사용하여 각 정점까지의 최단 거리를 업데이트하며 찾습니다.
벨만-포드 알고리즘은 음수 가중치를 포함하는 그래프에서 최단 경로를 찾는 알고리즘입니다. 다익스트라 알고리즘이 음수 가중치를 다루지 못하는 상황에서도 사용할 수 있는 알고리즘이며, 음수 가중치 사이클이 없는 경우에 사용됩니다.
알고리즘의 주요 아이디어는 다음과 같습니다:
벨만-포드 알고리즘의 시간 복잡도는 O(V * E)로, 다익스트라 알고리즘보다 더 높은 복잡도를 가지지만 음수 가중치를 처리할 수 있는 장점이 있습니다.