๋ฌธ์
์ธํ์ ์ํ ๋ฌธ์ ๋ ์์ด๋ก Traveling Salesman problem (TSP) ๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฌธ์ ๋ก computer science ๋ถ์ผ์์ ๊ฐ์ฅ ์ค์ํ๊ฒ ์ทจ๊ธ๋๋ ๋ฌธ์ ์ค ํ๋์ด๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ณ์ข ๋ฌธ์ ๊ฐ ์์ผ๋, ์ฌ๊ธฐ์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ํํ์ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด์.
1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ ๋์๋ค์ด ์๊ณ , ๋์๋ค ์ฌ์ด์๋ ๊ธธ์ด ์๋ค. (๊ธธ์ด ์์ ์๋ ์๋ค) ์ด์ ํ ์ธํ์์ด ์ด๋ ํ ๋์์์ ์ถ๋ฐํด N๊ฐ์ ๋์๋ฅผ ๋ชจ๋ ๊ฑฐ์ณ ๋ค์ ์๋์ ๋์๋ก ๋์์ค๋ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ณํํ๋ ค๊ณ ํ๋ค. ๋จ, ํ ๋ฒ ๊ฐ๋ ๋์๋ก๋ ๋ค์ ๊ฐ ์ ์๋ค. (๋งจ ๋ง์ง๋ง์ ์ฌํ์ ์ถ๋ฐํ๋ ๋์๋ก ๋์์ค๋ ๊ฒ์ ์์ธ) ์ด๋ฐ ์ฌํ ๊ฒฝ๋ก๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ ์ ์๋๋ฐ, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ ์ฌํ ๊ณํ์ ์ธ์ฐ๊ณ ์ ํ๋ค.
๊ฐ ๋์๊ฐ์ ์ด๋ํ๋๋ฐ ๋๋ ๋น์ฉ์ ํ๋ ฌ W[i][j]ํํ๋ก ์ฃผ์ด์ง๋ค. W[i][j]๋ ๋์ i์์ ๋์ j๋ก ๊ฐ๊ธฐ ์ํ ๋น์ฉ์ ๋ํ๋ธ๋ค. ๋น์ฉ์ ๋์นญ์ ์ด์ง ์๋ค. ์ฆ, W[i][j] ๋ W[j][i]์ ๋ค๋ฅผ ์ ์๋ค. ๋ชจ๋ ๋์๊ฐ์ ๋น์ฉ์ ์์ ์ ์์ด๋ค. W[i][i]๋ ํญ์ 0์ด๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ๋์ i์์ ๋์ j๋ก ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฉฐ ์ด๋ด ๊ฒฝ์ฐ W[i][j]=0์ด๋ผ๊ณ ํ์.
N๊ณผ ๋น์ฉ ํ๋ ฌ์ด ์ฃผ์ด์ก์ ๋, ๊ฐ์ฅ ์ ์ ๋น์ฉ์ ๋ค์ด๋ ์ธํ์์ ์ํ ์ฌํ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋์์ ์ N์ด ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 10) ๋ค์ N๊ฐ์ ์ค์๋ ๋น์ฉ ํ๋ ฌ์ด ์ฃผ์ด์ง๋ค. ๊ฐ ํ๋ ฌ์ ์ฑ๋ถ์ 1,000,000 ์ดํ์ ์์ ์ ์์ด๋ฉฐ, ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๋ 0์ด ์ฃผ์ด์ง๋ค. W[i][j]๋ ๋์ i์์ j๋ก ๊ฐ๊ธฐ ์ํ ๋น์ฉ์ ๋ํ๋ธ๋ค.
ํญ์ ์ํํ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ธํ์์ ์ํ์ ํ์ํ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
4
0 10 15 20
5 0 9 10
6 13 0 12
8 8 9 0
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
35
# ํ์ด ๋ฐฉ๋ฒ
์ฒ์์๋ ์ต์๋ผ๋ ๋จ์ด๋ง ๋ณด๊ณ bfs๋ก ์ ๊ทผํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ค์ ์๊ฐํด๋ณด๋ ์ด์ฐจํผ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๋๋๊ฑด ๋์ผํ๋ฐ ๊ตณ์ด dfs๊ฐ ์๋ bfs๋ก ์ ๊ทผํ ํ์๊ฐ ์์๋? ์๊ฐ์ด ๋ ๋ค.
(bfs์๋ ์์ bfsํ์ ์ค ๋ถ๊ธฐ๋ง๋ค visited ์ํ๊ฐ ๋ฌ๋ผ์ ธ์ผ ํ๋๋ฐ ์ด๊ฑธ ๊ตฌํํ๋ ๋ถ๋ถ์์ ๋ง์ด ํค๋งธ๋ค.)
- โ ๊น์ด(depth)๊ฐ ์ค์ํ์ง ์์ → BFS๊ฐ ๋นํจ์จ์
- โ ๋ชจ๋ ๊ฒฝ๋ก(์์ด)๋ฅผ ์์ ํ์ํ๊ณ , ์ต์ ๋์ ๋น์ฉ์ ์ฐพ์์ผ ํจ → DFS or DP๊ฐ ์ ํฉ
๋ฐ๋ผ์ dfs๋ก ๋ค์ ์๋ํ๋ค.
ํท๊ฐ๋ ธ๋ ํฌ์ธํธ๋.. iteration์ ๋๋ฉด์ ์ ์ฅํด์ผ ํ๋ ๋ณ์๋ฅผ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ ํ๋ ๋ฌธ์ ..
dfs์์ ์ ๋ฌํ๋ ์ธ์๊ฐ ๋ง์๋ ๋ฌธ์ ๋ ๊ฒ์ ์์๋ค.. ๋ง์ ์ฝ๋๋ก ๊ตฌํํ ๋ ํท๊ฐ๋ ธ์ง๋ง..
์ฌ์ ํ ์ผ๋ถ ์ฝ๋ ํ๋ํ๋ ๊ตฌํํ๋๊ฑด ๊ด์ฐฎ์๋ฐ ํน์ ํ ํฌ์ธํธ์์ ์ฎ์ง ๋ชปํ๋ ์ค
# ์ฝ๋
# 2025-04-16 11:35-12:35
import sys
sys.stdin = open("input.txt","r")
N = int(sys.stdin.readline().strip())
cost = [list(map(int,sys.stdin.readline().split())) for _ in range(N)]
min_cost = 1e7
def dfs(start, curr, visited, cnt, depth):
global min_cost
if depth == N:
if cost[curr][start] != 0:
min_cost = min(min_cost, cnt + cost[curr][start])
return
for i in range(N):
if not visited[i] and cost[curr][i] != 0:
visited[i] = True
dfs(start, i, visited, cnt + cost[curr][i], depth + 1)
visited[i] = False
for i in range(N):
visited = [False] * N
visited[i] = True
dfs(i, i, visited, 0, 1)
print(min_cost)
# ์ฐธ๊ณ (๋ฐํ์ ์ค๋ฅ ํด๊ฒฐ)
bfs๋ก ์๋ํ๋ ค๋ ํ์ด ์คํจ
# 2025-04-16 11:35-
import sys
from collections import deque
sys.stdin = open("input.txt","r")
MAX = 1e7
N = int(sys.stdin.readline().strip())
cost = [list(map(int,sys.stdin.readline().split())) for _ in range(N)]
def bfs(start):
cnt = 0
visited = set()
queue = deque()
queue.append((start,cnt))
while queue:
for _ in range(len(queue)):
v, cnt = queue.popleft()
print(v, cnt)
visited.add(v)
if len(visited) == N:
if cost[v][start] != 0:
return cnt + cost[v][start]
else:
return -1
for i in range(N):
if i != v:
next_v = i
if cost[v][next_v] != 0 and next_v not in visited:
queue.append((next_v,cnt+cost[v][next_v]))
min_cnt = MAX
for i in range(N):
cnt = bfs(i)
print(f'i={i},cnt={cnt}')
if cnt != -1: min_cnt = min(bfs(i),min_cnt)
print(min_cnt)
'๐ Study > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Silver III] 2606 - ๋ฐ์ด๋ฌ์ค (0) | 2025.04.19 |
---|---|
[Gold V] 7576 - ํ ๋งํ (0) | 2025.04.19 |
[Gold IV] 3055 - ํ์ถ (0) | 2025.04.15 |
[Gold IV] 1987 - ์ํ๋ฒณ (0) | 2025.04.14 |
[Gold III] 1726 - ๋ก๋ด (0) | 2025.04.14 |