λ°μν
π λ€μ΅μ€νΈλΌ(dijkstra) λ
- λ€μ΅μ€νΈλΌλ₯Ό λ€μ΄κ°κΈ° μ μ... μ΅λ¨ κ²½λ‘λ
- κ°μ μ κ°μ€μΉκ° μλ κ·Έλνμμ λ μ μ μ¬μ΄μ κ²½λ‘λ€ μ€ κ°μ μ κ°μ€μΉμ ν©μ΄ μ΅μμΈ κ²½λ‘
- κ°μ μ κ°μ€μΉκ° κ· μΌ(1)ν κ²½μ° BFSλ₯Ό μ¬μ©
- μμ κ°μ€μΉλ₯Ό νμ©νμ§ μμ
- νλμ μμ μ μ μμ λ μ μ κΉμ§μ μ΅λ¨κ²½λ‘
- μμ μ μ μμ κ±°λ¦¬κ° μ΅μμΈ μ μ μ μ νν΄ λκ°λ©΄μ μ΅λ¨ κ²½λ‘λ₯Ό ꡬνλ λ°©μμ΄λ€.
- μμ μ μ (s) μμ λ μ μ (t) κΉμ§μ μ΅λ¨ κ²½λ‘μ μ μ x κ° μ‘΄μ¬νλ€.
- μ΄λ, μ΅λ¨ κ²½λ‘λ s μμ x κΉμ§μ μ΅λ¨κ²½λ‘μ x μμ t κΉμ§μ μ΅λ¨κ²½λ‘λ‘ κ΅¬μ±λλ€.
- νμ κΈ°λ²μ μ¬μ©ν μκ³ λ¦¬μ¦μΌλ‘ MSTμ νλ¦Ό μκ³ λ¦¬μ¦κ³Ό μ μ¬νλ€.
- μλ μ½λμ κ²½μ° μκ°λ³΅μ‘λλ O(N^2) μ΄λ€.
- λ§μ½ μ°μ μμνλ₯Ό μ΄μ©νκ² λλ€λ©΄ O(NlogN) μΌλ‘ μκ°λ³΅μ‘λλ₯Ό μ€μΌ μ μλ€.
π λ€μ΅μ€νΈλΌ(dijkstra) ꡬν
V, E = 6, 11
edges = [
[0, 1, 3],
[0, 2, 5],
[1, 2, 2],
[1, 3, 6],
[2, 1, 1],
[2, 3, 4],
[2, 4, 6],
[3, 4, 2],
[3, 5, 3],
[4, 0, 3],
[4, 5, 6]
]
# μΈμ 리μ€νΈ λ§λ€κΈ°
adj = {x: [] for x in range(V)}
for edge in edges:
s, e, c = edge
adj[s].append([e, c])
# dist, visited
dist = [float('inf')] * V
visited = [False] * V
# μμμ μ ν, λͺ¨λ μ μ μ ν
dist[0] = 0
cnt = 0
while cnt < V:
# distκ° μ΅μμΈ μ μ μ°ΎκΈ°
min_dist = float('inf')
u = -1
for i in range(V):
if not visited[i] and dist[i] < min_dist:
min_dist = dist[i]
u = i
# μ μ μ νλ μ ν
visited[u] = True
# κ°μ μν
for w, cost in adj[u]: # λμ°©μ μ , κ°μ€μΉ
if dist[u] + cost < dist[w]:
dist[w] = dist[u] + cost
cnt += 1
print(dist)
λ°μν
'CS > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νλ‘μ΄λ μμ¬(Floyd Warshall) (0) | 2020.10.04 |
---|---|
μλΌν μ€ν λ€μ€μ 체(Sieve Of Eratosthenes) (0) | 2020.10.03 |
λ€μ΄λλ―Ήνλ‘κ·Έλλ°(Dynamic Programming) (0) | 2020.10.01 |
ν¬λ£¨μ€μΉΌ μκ³ λ¦¬μ¦(kruskal) (0) | 2020.09.30 |
μλ‘μ μ§ν©(Disjoint-set) (0) | 2020.09.29 |