๋ฐ์ํ

๐ ๋ค์ต์คํธ๋ผ(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 |