๐Ÿ“š Study/Baekjoon

[Silver II] 10971 - ์™ธํŒ์› ์ˆœํšŒ2

์œฐ๊ฐฑ 2025. 4. 16. 14:06

๋ฌธ์ œ

์™ธํŒ์› ์ˆœํšŒ ๋ฌธ์ œ๋Š” ์˜์–ด๋กœ 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