3가지 최단 경로 찾기 알고리즘과 각각이 어떤 문제에서 사용되는지에 대한 포스팅입니다 .
1️⃣ 다익스트라(dijkstra) : 대부분의 최단 경로 문제
다익스트라는 최단 경로 찾기 알고리즘 중 가장 빠르기 때문에 대부분의 문제에서 사용합니다. (다익스트라의 시간복잡도는 O(N+ElogE)입니다.
💛 다익스트라 전체 코드 (백준 1753)
import heapq
V, E = map(int, input().split())
K = int(input())
adjList = [[] for _ in range(V+1)]
for i in range(E):
u, v, w = map(int, input().split())
adjList[u].append((v,w))
hq = []
visited = [0]*(V+1)
heapq.heappush(hq, (0, K))
dist = [float('inf')]*(V+1) # 도착점 i에 대한 최단 경로
dist[K] = 0
while hq:
distance, temp = heapq.heappop(hq)
if visited[temp]: continue
visited[temp] = 1
for to, cost in adjList[temp]:
if distance+cost < dist[to]:
dist[to] = distance+cost
heapq.heappush(hq, [distance+cost, to])
for i in range(1, V+1):
if dist[i] == float('inf'):
print('INF')
else:
print(dist[i])
💚 다익스트라 관련 백준 문제
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.
www.acmicpc.net
5719번: 거의 최단 경로
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 장소의 수 N (2 ≤ N ≤ 500)과 도로의 수 M (1 ≤ M ≤ 104)가 주어진다. 장소는 0부터 N-1번까지 번호가 매겨져 있
www.acmicpc.net
1753번: 최단경로
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다.
www.acmicpc.net
2️⃣ 벨만포드(bellmanFord) : 간선 비용 중 음수가 있을 때
💚 벨만포드 관련 문제
11657번: 타임머신
첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다.
www.acmicpc.net
11657번: 타임머신
첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)가 주어진다.
www.acmicpc.net
3️⃣ 플로이드 워셜(Floyd-Warshall)
- 플로이드 워셜은 가능한 모든 노드 쌍에 대해 최단 거리를 구하는 알고리즘 입니다. (코드 이해가 쉬움)
- 플로이드 워셜로 풀이할 수 있는 문제는 모두 다익스트라로 풀 수 있기 때문에 저는 더 빠른 다익스트라를 선호합니다.
- i > k이고 k > j 이면 i > j를 만족함을 이용합니다.
- s부터 e까지 가는 최단 거리를 d[s][e]라고 정의할 때, d에 대한 구현은 d[s][e] = min(d[s][e], d[s][m] + d[m][e])
for m in range(1, N+1):
for s in range(1, N+1):
for e in range(1, N+1):
d[s][e] = min(d[s][e], d[s][m] + d[m][e])
💚 플로이드 워셜 관련 문제
2458번: 키 순서
1번부터 N번까지 번호가 붙여져 있는 학생들에 대하여 두 학생끼리 키를 비교한 결과의 일부가 주어져 있다. 단, N명의 학생들의 키는 모두 다르다고 가정한다. 예를 들어, 6명의 학생들에 대하여
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
[DP] 가장 긴 증가하는 부분 수열(LIS)의 구현 방법, 활용 백준 문제 모음 (0) | 2021.03.31 |
---|---|
[Python] 백트래킹 구현 방법, 관련 문제 모음 (0) | 2021.03.31 |
[Python] 파이썬 다이나믹(동적) 프로그래밍 구현, 관련 문제 모음 (0) | 2021.03.31 |