๋ณต์ต
- ๊ทธ๋ํ: ๋ ธ๋์ ๋ ธ๋ ์ฌ์ด์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ
- ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ฐ๊ฒฐ๋์ด ์๋ค --> ๊ฐ์ฅ ๋จผ์ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ ๋ ์ฌ๋ ค์ผํจ.
[๊ทธ๋ํ์ ํธ๋ฆฌ ์๋ฃ๊ตฌ์กฐ ๋น๊ต]
๊ทธ๋ํ | ํธ๋ฆฌ | |
๋ฐฉํฅ์ฑ | ๋ฐฉํฅ ๊ทธ๋ํ or ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ | ๋ฐฉํฅ ๊ทธ๋ํ |
์ํ์ฑ | ์ํ ๋ฐ ๋น์ํ | ๋น์ํ |
๋ฃจํธ ๋ ธ๋ ์กด์ฌ ์ฌ๋ถ | ๋ฃจํธ ๋ ธํธ X | ๋ฃจํธ ๋ ธ๋ ์กด์ฌ |
๋ ธ๋ ๊ฐ ๊ด๊ณ์ฑ | ๋ถ๋ชจ์ ์์ ๊ด๊ณ ์์ | ๋ถ๋ชจ์ ์์ ๊ด๊ณ |
๋ชจ๋ธ์ ์ข ๋ฅ | ๋คํธ์ํฌ ๋ชจ๋ธ | ๊ณ์ธต ๋ชจ๋ธ |
๊ทธ๋ํ์ ๊ตฌํ ๋ฐฉ๋ฒ
1. ์ธ์ ํ๋ ฌ(Adjacency Matrix): 2์ฐจ์ ๋ฐฐ์ด ์ฌ์ฉ
2. ์ธ์ ๋ฆฌ์คํธ(Adjacency List): ๋ฆฌ์คํธ ์ฌ์ฉ
๋ ธ๋์ ๊ฐ์๊ฐ V, ๊ฐ์ ์ ๊ฐ์๊ฐ E์ธ ๊ฒฝ์ฐ ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ ๊ตฌํ ๋น๊ต
์ธ์ ํ๋ ฌ ์ด์ฉ | ์ธ์ ๋ฆฌ์คํธ ์ด์ฉ | |
๊ฐ์ ์ ๋ณด ์ ์ฅ | O(V^2) ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ์ | O(E) ๋งํผ๋ง ํ์ |
ํน์ ํ ๋ ธ๋ A์์ ๋ค๋ฅธ ํน์ ํ ๋ ธ๋ B๋ก ์ด์ด์ง ๊ฐ์ ์ ๋น์ฉ ์๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ | O(1)์ ์๊ฐ์ผ๋ก ์ ์ ์์ | O(V)์ ์๊ฐ์ด ์์ |
์์ ์ ๋ ฌ
- ์์๊ฐ ์ ํด์ ธ ์๋ ์ผ๋ จ์ ์์ ์ ์ฐจ๋ก๋๋ก ์ํํด์ผ ํ ๋ ์ฌ์ฉํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ฐฉํฅ ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ '๋ฐฉํฅ์ฑ์ ๊ฑฐ์ค๋ฅด์ง ์๋๋ก ์์๋๋ก ๋์ดํ๋ ๊ฒ
- ๊ทธ๋ํ์์์ ์ ํ ๊ด๊ณ๊ฐ ์๋ค๋ฉด ์์ ์ ๋ ฌ ์ํํด ๋ชจ๋ ์ ํ ๊ด๊ณ๋ฅผ ์งํค๋ ์ ์ฒด ์์๋ฅผ ๊ณ์ฐํ ์ ์์
โป ์ง์ ์ฐจ์๋? ํน์ ํ ๋ ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ ๊ฐ์
์์์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค.
- ํ๊ฐ ๋น ๋๊น์ง ๋ค์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ํ์์ ์์๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์์ ์ถ๋ฐํ๋ ๊ฐ์ ์ ๊ทธ๋ํ์์ ์ ๊ฑฐ
- ์๋กญ๊ฒ ์ง์ ์ฐจ์๊ฐ 0์ด ๋ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๊ธฐ
์ด๋ฐ ๋ฐฉํฅ ๊ทธ๋ํ๊ฐ ์๋ค๋ฉด
์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๊ณ
ํ๋์ฉ ์์๋ฅผ ๋นผ๊ฐ๋ฉฐ ์งํํ๋ ๊ฒ.
์์ ์์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
from collections import deque
# ๋
ธ๋์ ๊ฐ์์ ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ ๋ฐ๊ธฐ
v, e = map(int, input().split())
# ๋ชจ๋ ๋
ธ๋์ ๋ํ ์ง์
์ฐจ์๋ 0์ผ๋ก ์ด๊ธฐํ
indegree = [0] * (v + 1)
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ์ด๊ธฐํ
graph = [[] for i in range(v + 1)]
# ๋ฐฉํฅ ๊ทธ๋ํ์ ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ ๋ฐ๊ธฐ
for _ in range(e):
a, b = map(int, input().split())
graph[a].append(b) # ์ ์ A์์ B๋ก ์ด๋ ๊ฐ๋ฅ
# ์ง์
์ฐจ์๋ฅผ 1 ์ฆ๊ฐ
indegree[b] += 1
# ์์ ์ ๋ ฌ ํจ์
def topology_sort():
result = [] # ์๊ณ ๋ฆฌ์ฆ ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ฆฌ์คํธ
q = deque() # ํ ๊ธฐ๋ฅ์ ์ํ deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
# ์ฒ์ ์์ํ ๋๋ ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
for i in range(1, v + 1):
if indegree[i] == 0:
q.append(i)
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while q:
# ํ์์ ์์ ๊บผ๋ด๊ธฐ
now = q.popleft()
result.append(now)
# ํด๋น ์์์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ง์
์ฐจ์์์ 1 ๋นผ๊ธฐ
for i in graph[now]:
indegree[i] -= 1
# ์๋กญ๊ฒ ์ง์
์ฐจ์๊ฐ 0์ด ๋๋ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
if indegree[i] == 0:
q.append(i)
# ์์ ์ ๋ ฌ์ ์ํํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
for i in result:
print(i, end=' ')
topology_sort()
์์์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋
- ์ฐจ๋ก๋๋ก ๋ชจ๋ ๋ ธ๋ ํ์ธํ๋ฉด์ ํด๋น ๋ ธ๋์์ ์ถ๋ฐํ๋ ๊ฐ์ ์ ์ฐจ๋ก๋๋ก ์ ๊ฑฐํด์ผํจ
- O(V+E)
N๊ฐ์ ๊ฐ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, N๊ฐ์ ๊ฐ์์ ๋ํด ์๊ฐํ๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ ๊ตฌํ๊ธฐ
์ ๋ ฅ: ์ฒซ์งธ ์ค์ ๋ฃ๊ณ ์ ํ๋ ๊ฐ์์ ์ N ์ฃผ์ด์ง / ๋ค์ N๊ฐ์ ์ค์ ๊ฐ ๊ฐ์์ ๊ฐ์ ์๊ฐ๊ณผ ๊ทธ ๊ฐ์๋ฅผ ๋ฃ๊ธฐ ์ํด ๋จผ์ ๋ค์ด์ผ ํ๋ ๊ฐ์๋ค์ ๋ฒํธ๊ฐ ์์ฐ์๋ก ์ฃผ์ด์ง๋ฉฐ ๊ฐ ์์ฐ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ.
์ถ๋ ฅ: N๊ฐ์ ๊ฐ์์ ๋ํด ์๊ฐํ๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅ
# ์
๋ ฅ์์
5
10 -1
10 1 -1
4 1 -1
4 3 1 -1
3 3 -1
# ์ถ๋ ฅ์์
10
20
14
18
17
from collections import deque
import copy
# ๋
ธ๋์ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
v = int(input())
# ๋ชจ๋ ๋
ธ๋์ ๋ํ ์ง์
์ฐจ์๋ 0์ผ๋ก ์ด๊ธฐํ
indegree = [0] * (v + 1)
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(๊ทธ๋ํ) ์ด๊ธฐํ
graph = [[] for i in range(v + 1)]
# ๊ฐ ๊ฐ์ ์๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ
time = [0] * (v + 1)
# ๋ฐฉํฅ ๊ทธ๋ํ์ ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
for i in range(1, v + 1):
data = list(map(int, input().split()))
time[i] = data[0] # ์ฒซ ๋ฒ์งธ ์๋ ์๊ฐ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์
for x in data[1:-1]:
indegree[i] += 1
graph[x].append(i)
# ์์ ์ ๋ ฌ ํจ์
def topology_sort():
result = copy.deepcopy(time) # ์๊ณ ๋ฆฌ์ฆ ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ฆฌ์คํธ
q = deque() # ํ ๊ธฐ๋ฅ์ ์ํ deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
# ์ฒ์ ์์ํ ๋๋ ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
for i in range(1, v + 1):
if indegree[i] == 0:
q.append(i)
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while q:
# ํ์์ ์์ ๊บผ๋ด๊ธฐ
now = q.popleft()
# ํด๋น ์์์ ์ฐ๊ฒฐ๋ ๋
ธ๋๋ค์ ์ง์
์ฐจ์์์ 1 ๋นผ๊ธฐ
for i in graph[now]:
result[i] = max(result[i], result[now] + time[i])
indegree[i] -= 1
# ์๋กญ๊ฒ ์ง์
์ฐจ์๊ฐ 0์ด ๋๋ ๋
ธ๋๋ฅผ ํ์ ์ฝ์
if indegree[i] == 0:
q.append(i)
# ์์ ์ ๋ ฌ์ ์ํํ ๊ฒฐ๊ณผ ์ถ๋ ฅ
for i in range(1, v + 1):
print(result[i])
topology_sort()
# ์์ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ graph ๋ณ์์ indegree์ ๋ด๊ฒจ์๋ ๊ฐ
graph = [[], [2, 3, 4], [], [4, 5], [], []]
indegree = [0, 0, 1, 1, 2, 1]
[์ถ์ฒ] ํ๋น๋ฏธ๋์ด- "์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ" ๋๋๋น ์ ์
'Algorithms > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ด ์ฌ์ดํด (๋ฐฑ์ค 10451) (0) | 2021.10.12 |
---|---|
์ฐ๊ฒฐ์์์๊ฐ์ (๋ฐฑ์ค 11724) (0) | 2021.10.12 |
์ด๋ถ ๊ทธ๋ํ (๋ฐฑ์ค 1707) (0) | 2021.10.08 |
[๋ฐ์ดํฐ ๊ตฌ์กฐ] ๋ฐฐ์ด(Array)์ ์ฐ๊ฒฐ๋ฆฌ์คํธ(Linked List)๋ก ๋ฆฌ์คํธ ์ถ์์๋ฃํ ๊ตฌํ (with C) (0) | 2021.04.16 |
[์๊ณ ๋ฆฌ์ฆ] ๋ณต์ก๋(Complexity)์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ (0) | 2021.01.16 |