๐ŸŽฒ[์•Œ๊ณ ๋ฆฌ์ฆ˜] TSP(Traveling Salesman Problem)

์ด๊ฐ•์šฑยท2022๋…„ 10์›” 18์ผ
1

๐ŸŽฒ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
5/5

Hamiltonian Cycle

A tour (a Hamiltonian cycle) is a path from a vertex to itself that passes through each other vertex exactly once.

์–ด๋–ค ๊ทธ๋ž˜ํ”„์—์„œ, ์–ด๋–ค ์ •์  ์‹œ์ž‘ํ•ด ๋ชจ๋“  ์ •์ ์„ ๋”ฑ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋ฐฉ๋ฌธํ•˜๊ณ  ๊ทธ ์ •์ ์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒฝ๋กœ. TSP๋ฌธ์ œ๋Š” ์ด ํ•ด๋ฐ€ํ† ๋‹ˆ์•ˆ ์‚ฌ์ดํด ์ค‘ ๊ฐ€์žฅ ๊ธธ์ด๊ฐ€ ์งง์€ ์‚ฌ์ดํด์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ ‘๊ทผ๋ฒ•

Let G=(V,E)G = (V,E) be a graph with V={v1,v2,...,vn}V = \lbrace{v_1,v_2,...,v_n\rbrace}.

๊ทธ๋ž˜ํ”„ G๊ฐ€ ์žˆ๊ณ , ์ •์  ๋“ค์˜ ์ง‘ํ•ฉ V๊ฐ€ ์žˆ๋‹ค.

Brute-force / ์™„์ „ํƒ์ƒ‰


์‹œ์ž‘์ ์„ ์ œ์™ธํ•œ ์ •์ ๋“ค๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” permutation์„ ๋ชจ๋‘ ๊ตฌํ•ด์„œ, ์–‘๋์— ์‹œ์ž‘์ ์„ ๋”ํ•ด์ค€ sequence๊ฐ€ tour๊ฐ€ ๋˜๋Š”์ง€ ์ฆ‰, ๊ทธ ์ˆœ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด๋ฐ€ํ† ๋‹ˆ์•ˆ ์‚ฌ์ดํด ํ•˜๋‚˜๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ ์ตœ์†Œ๊ฐ’์„ ์œ ์ง€ํ•˜๋Š” C๋ผ๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

๐‘‡(๐‘›)=ฮ˜(๐‘›!) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

Heuristic Algorithm

Nearest Neighbor(NN). ์‹œ์ž‘์ ์—์„œ ์‹œ์ž‘ํ•ด ์—ฐ๊ฒฐ๋˜์žˆ๋Š” ์ •์ ๋“ค ์ค‘ ๊ฐ€์žฅ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ์ •์ ์„ tour์— ์ถ”๊ฐ€ํ•˜๊ณ , ์ด๋™ํ•œ ๊ทธ ์ •์ ์—์„œ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. last๋Š” ๋ฐ”๋กœ ์ด์ „ ๋‹จ๊ณ„์˜ ์ •์ ์„ ์˜๋ฏธ.
๐‘‡(๐‘›)=O(๐‘›^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ, heuristic algorithm์ด๊ธฐ์— ๋„์ถœ๋œ tour๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ•ด๋ฐ€ํ† ๋‹ˆ์•ˆ ์‚ฌ์ดํด ์ค‘์—์„œ ๊ฐ€์žฅ ์งง์€ tour์ธ์ง€ (optimal ํ•œ์ง€) ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. optimal๊ณผ ๊ทผ์ ‘ํ•˜๊ธด ํ•˜๋‹ค.

์‹ค์ œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜๋ก€๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด tour๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด a - d - e - b - c - f - a ๊ฐ€ ๋‚˜์˜ค๊ณ  ๊ธธ์ด๋Š” 12์ด๋‹ค.
ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์งง์€ tour๋Š” a - b - c - f - e - d - a ์ด๊ณ  ๊ธธ์ด๋Š” 10์ด๋‹ค.

Dynamic Programming

The Principle of Optimality

T๋ฅผ optimal tour๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๊ทธ tour๋ฅผ V_pi์—์„œ ์ž˜๋ผ์„œ V_1๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ P๋ผ๊ณ  ํ•˜์ž. ์šฐ๋ฆฌ๋Š” ์ „์ฒด ์ตœ์ ์˜ ํ•ด T์—์„œ ๋ฝ‘์•„๋‚ธ ๋ถ€๋ถ„ P ๋˜ํ•œ ์ตœ์ ์ธ์ง€๋ฅผ ์ฆ๋ช…ํ•˜๊ณ  ์‹ถ๋‹ค.

๊ทผ๋ฐ ๋งŒ์•ฝ P์™€ ๊ฐ™์ด V_pi์—์„œ ์‹œ์ž‘ํ•˜์ง€๋งŒ V_1๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅด๋ฉด์„œ, P ๋ณด๋‹ค ๋” ์งง์€ ๊ฑฐ๋ฆฌ๋กœ V_1์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ P'๋ผ๊ณ  ํ•˜์ž. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๊นŒ P๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฅธ V_pi์—์„œ ๊ทธ ์ด์ „์˜ ๊ฒฝ๋กœ ์ฆ‰, T-P ์™€ P'์„ ๋”ํ•œ T'(T' = T-P + P')์€ T๋ณด๋‹ค ๋” ์งง์€ tour์ผ ๊ฒƒ์ด๋‹ค. T-P๋Š” ๋ณ€ํ•จ์ด ์—†์ง€๋งŒ P ๋ณด๋‹ค ๋” ์งง์€ P'์ด ๋”ํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Š” ๋งจ ์ฒ˜์Œ์— T๋ฅผ optimal tour๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ๋˜ ๊ฒƒ์— ๋ชจ์ˆœ์ด๋‹ค.
๊ทธ๋ž˜์„œ P๊ฐ€ V_pi ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด V_1๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ์ค‘ ์ตœ์ ์˜ ๊ฒฝ๋กœ(๋ถ€๋ถ„ ์ตœ์ ์˜ ํ•ด)๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๊ณ , '์ตœ์ ์˜ ๋ถ€๋ถ„๋„ ์ตœ์ ์ด ๋œ๋‹ค'๋Š” ๊ฒƒ์ด ์ฆ๋ช… ๋œ ๊ฒƒ์ด๋‹ค.

๊ทธ ์™€์ค‘์— P๋ฅผ ๋‹ค์‹œ ์ „์ฒด๋กœ ๋‘๊ณ  ๋‹ค์‹œ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ฐ™์€ ์ฆ๋ช…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. P ๊ฒฝ๋กœ์—์„œ ์ฒ˜์Œ๊ณผ ๋์„ ์ œ์™ธํ•œ ์–ด๋Š ์ •์ ์„ ๊ณจ๋ผ ๋‹ค์‹œ ๋ถ€๋ถ„์„ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ™์€ ์ฆ๋ช…์„ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ๋ถ€๋ถ„์€ ๋˜ ์ตœ์ ์ž„์ด ์ฆ๋ช…๋œ๋‹ค.

DP

์ด๋Ÿฐ ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ, DP๋ฅผ ๋ฌธ์ œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
D[V_i][A]๊ฐ€ ๊ฐ™๋Š” ๊ฐ’์˜ ์˜๋ฏธ๋Š” V_i๋กœ ์‹œ์ž‘ํ•ด์„œ A์— ์žˆ๋Š” ์ •์ ๋“ค์„ ํ•œ ๋ฒˆ ์”ฉ๋งŒ ๊ฑฐ์ณ V_1(์‹œ์ž‘์ )์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ ์ค‘ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ์˜ ๊ธธ์ด์ด๋‹ค.

์ ํ™”์‹์˜ ์˜๋ฏธ๋Š” ์•„๊นŒ principle of optimality์—์„œ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ถ€๋ถ„์„ ๋‚˜๋ˆŒ๋•Œ (V_i ~ V_1์—์„œ) V_j์œผ๋กœ ์ž๋ฅด๋ฉด V_j๋ถ€ํ„ฐ ๋’ค๋Š” ๋‹ค ์ตœ์ ์ด๊ณ  (์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ํ™•์ธํ•ด์„œ ๊ฐ€์žฅ ์ตœ์ ์„ ๊ณ ๋ฅผ ์˜ˆ์ •์ด๊ณ ) ๊ทธ ์ตœ์ ๊ฐ’์— V_i ~ V_j ์˜ ๊ฐ„์„ ์„ ๋”ํ•ด์ฃผ๋ฉด ์ „์ฒด ์ตœ์ ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด ์„ค๋ช…์„ ๋“ค์œผ๋ฉด top-down ๋ฐฉ์‹์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ, ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ• ๋•Œ ํ‘œํ˜„๋งŒ top-down์ด ๋˜๊ณ  ์‹ค์ œ๋กœ dpํ…Œ์ด๋ธ”์€ bottom-up์œผ๋กœ ์ฑ„์›Œ์ง„๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด DP ๋ฐฉ์‹ ๋˜ํ•œ ์™„์ „ํƒ์ƒ‰์ฒ˜๋Ÿผ ํŠธ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
๊ฐ ๋…ธ๋“œ๋Š” ํ•ด๋‹น ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ตœ์ ์„ '๋ณด์žฅ'ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด B:{C} ๋Š” B์—์„œ ์‹œ์ž‘ํ•ด C๋ฅผ ๊ฑฐ์ณ ์‹œ์ž‘(A)๋กœ ๊ฐ€๋Š” ์ตœ์ ์˜(๊ฐ€์žฅ์งง์€) ๊ฐ’์ž„์ด ๋ณด์žฅ๋œ๋‹ค.

๊ทผ๋ฐ D:{B,C} ๋˜ํ•œ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ตœ์ ์„ ๋ณด์žฅํ•ด์•ผ ํ•  ํ…๋ฐ, ํŠธ๋ฆฌ์—์„œ D:{B,C}์— ํ•ด๋‹นํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ 2๊ฐœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋‘˜์˜ ๊ฐ’์„ ๋น„๊ตํ•ด ์ตœ์ ๊ฐ’์„ ์ทจํ•œ๋‹ค. ์ตœ์ ๊ฐ’์ด ํ™•์ธ๋œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ ๊ฐ’์„ DPํ…Œ์ด๋ธ”์— ์ €์žฅํ•œ๋‹ค. ๋‹ค๋ฅธ ๊ฒน์น˜๋Š” ๋…ธ๋“œ๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ์ ๊ฐ’์„ ์ทจํ•˜๊ณ  ์ €์žฅํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ, ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ๋”ฐ์ง€๋˜, ์ตœ์ ์ž„์„ ๋ณด์žฅํ•˜๋Š” ๋ถ€๋ถ„๋“ค์„ ์ €์žฅํ•ด์„œ ๋‹ค์‹œ ํ™œ์šฉํ•˜๋Š” DP์˜ ๋ฐฉ์‹์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ตญ ์œ„์™€ ๊ฐ™์ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ A:{B,C,D}์— ์ „์ฒด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ์ด ์ €์žฅ๋œ๋‹ค.

ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์‹œ๊ฐ„๋ณต์žก๋„์™€ ๊ด€๋ จ์ด ์žˆ์„ ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ์œ„์˜ ๊ทธ๋ฆผ์—์„œ ๋ณด์ด๋“ฏ ์‹œ์ž‘์ •์ (A)๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์ •์ ๋“ค์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ๊ณผ ๊ด€๋ จ์žˆ๋‹ค.

๋‚˜๋จธ์ง€ ์ •์ ๋“ค B,C,D๋ฅผ ๊ฐ๊ฐ์˜ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด B์˜ ๊ฒฝ์šฐ ๋‚จ์€ ์ •์ ์ด C์™€ D์ด๋ฏ€๋กœ {C,D}์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ง‘ํ•ฉ 2^2๊ฐœ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋‚˜๋จธ์ง€ C, D์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋ฌธ์ œ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด๋ฏ€๋กœ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” 2^2 * 3. ์ด๊ฒƒ์„ ์ผ๋ฐ˜ํ™” ํ•ด๋ณด์ž๋ฉด, ๋งจ์ฒ˜์Œ ๋ชจ๋“  ์ •์ ์˜ ๊ฐœ์ˆ˜๋Š” n ์ด๋ฏ€๋กœ (2^(n-2)) * (n-1)์ด ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋…ธ๋“œ์—์„œ ์ตœ์ ์ด ๊ฒฐ์ •๋˜๊ธฐ ์ „, ๊ทธ ๋…ธ๋“œ์˜ ๊ฐ ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C:{B,D} ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ D:{B}, B:{D} ๋…ธ๋“œ๋ฅผ ํ™•์ธ(๋ถ€๋ถ„๋ฌธ์ œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ตœ์ ๋“ค์„ ๋น„๊ตํ•ด ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ตœ์ ์„ ๊ฒฐ์ •)ํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” ๋…ธ๋“œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ ์ตœ๋Œ€ O(n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n) x O(n * 2^n) -> O(n^2 * 2^n)์ด ๋ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. brute-force ๋ฐฉ๋ฒ• ์‚ฌ์šฉ์‹œ์˜ O(n!)๋ณด๋‹ค ๋งŽ์ด ๊ฐœ์„ ๋œ ์‹œ๊ฐ„์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

BitMasking

๊ทธ๋ ‡๋‹ค๋ฉด DPํ…Œ์ด๋ธ”์— ํ•ด๋‹น ๋…ธ๋“œ์˜ ๊ฐ’์„ ์ €์žฅํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ์„ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€? ํ–‰์€ ๊ฐ ์ •์ ์˜ ์ด๋ฆ„, ์—ด์€ ๊ฐ ์ •์ ๋“ค์ด ๊ฒฝ๋กœ์— ํฌํ•จ๋˜์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‹ด์€ ์ •๋ณด๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ ์ •์ ๋“ค์ด ๊ฒฝ๋กœ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ '๋น„ํŠธ๋งˆ์Šคํ‚น'์„ ํ†ตํ•ด ํ‘œํ˜„ํ•œ๋‹ค.
A, B, C, D 4๊ฐœ์˜ ์ •์ ์ด ์žˆ์„ ๋•Œ ๊ฐ ์ •์ ์ด ํฌํ•จ(1), ๋ฏธํฌํ•จ(0)๋œ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์„ธ๋ฉด 2^4=16 ๊ฐ€์ง€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ 0๋ถ€ํ„ฐ 15๊นŒ์ง€์˜ ์‹ญ์ง„์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •์ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ด์ง„์ˆ˜์ž๋ฆฌ๊ฐ€ ์ƒ๊ธด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด A์™€ C๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ๋Š”
DCBA
0101(2) = 5 ๋ผ๋Š” ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ์ด๋ ‡๊ฒŒ ํ‘œํ˜„๋œ ๊ฐ’์—์„œ ํŠน์ • ์ •์ ์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ๋•Œ๋„ ์ด์ง„๋ฒ•์„ ์ ๊ทน ํ™œ์šฉํ•œ๋‹ค. ์•ž์„œ ๋“  ์˜ˆ์—์„œ C๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์‚ดํŽด๋ณผ ๋•Œ C๊ฐ€ i๋ฒˆ์งธ ์ •์ ์ด๋ผ๊ณ  ํ•˜๋ฉด, 5 & (1 << i) ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • 'a << b' ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์€ a๋ฅผ ์ด์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ–ˆ์„ ๋•Œ ๊ฐ ์ˆซ์ž๋ฅผ ์™ผ์ชฝ์œผ๋กœ b์นธ ์ด๋™ํ•œ ๊ฐ’์„ ์ค€๋‹ค. 4(100) << 2 ๋Š” 16(10000) ์ด ๋œ๋‹ค.
  • 'a & b' ์—ฐ์‚ฐ์€ a์™€ b๋ฅผ ๊ฐ๊ฐ ์ด์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ–ˆ์„ ๋•Œ ์–ด๋–ค ์ž๋ฆฌ์ˆ˜์˜ ์ˆ˜๊ฐ€ ๋‘˜๋‹ค 1์ด๋ฉด ๊ทธ ์ž๋ฆฌ์— 1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 10 & 5 ๋Š” 4๊ฐ€ ๋œ๋‹ค.
1110 = 10
0101 = 5
----
0100 = 4 

์œ„์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•˜๋ฉด, C๋Š” 2๋ฒˆ์งธ(0๋ถ€ํ„ฐ์‹œ์ž‘) ์ •์ ์ด๋ฏ€๋กœ

0101 = 5
0100 = 4 = 1 << 2(๋ฒˆ์งธ)
----
0100 = 4 (0์ด ์•„๋‹˜)

์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ •๋ฆฌํ•ด๋ณด๋ฉด ํ•ด๋‹น ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํฌํ•จ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ๋•Œ 0(0000)์ด ๋‚˜์˜จ๋‹ค๋ฉด ํฌํ•จ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์ด๊ณ , 0์ด ์•„๋‹Œ ์–ด๋–ค ๊ฐ’(0100)์ด ๋‚˜์™”๋‹ค๋ฉด ํฌํ•จ๋˜์—ˆ๋‹ค๋Š” ๋ง์ด ๋œ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„์—์„œ ํ™œ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ ํฌํ•จ์—ฌ๋ถ€ ๊ฒ€์‚ฌ๋ณด๋‹ค ํ›จ์”ฌ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ์‰ฌํ”„ํŠธ ์—ฐ์‚ฐ์€ ๋น ๋ฅธ ์—ฐ์‚ฐ์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ตฌํ˜„

๋ฐฑ์ค€ 2098๋ฒˆ ์™ธํŒ์›์ˆœํšŒ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด DP์™€ BitMasking์„ ํ™œ์šฉํ•œ TSP ๊ตฌํ˜„์„ ํ•ด ๋ณผ์ˆ˜ ์žˆ๋‹ค.

import sys

n = int(input())
w = [] 
for _ in range(n):
    w.append(list(map(int, sys.stdin.readline().split())))
dp = [[-1] * (1<<(n-1)) for _ in range(n)]  # ์–ด์ฐจํ”ผ ์‹œ์ž‘ ์ •์ ์˜ ์ด์ง„์ˆ˜ ์ž๋ฆฌ๋Š” ํ•ญ์ƒ 1์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ์นธ ์ค„์—ฌ์„œ.
                                            # n-1๊ฐœ์˜ bit๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1<<(n-1).
                                            # ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜์—๋Œ€ํ•œ ์‹ญ์ง„์ˆ˜ i๋Š”  0 <= i <= 1<<(n-1) - 1
                                            # ๊ทธ๋ž˜์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์‹ญ์ง„์ˆ˜๋ฅผ 1<<(n-1) - 1 ๋กœ ์ค€๋‹ค.
def go(i, included):
    if not included and w[i][0]:     # v_i : {}
    								 # ๋ชจ๋“  ์ž๋ฆฌ์ˆ˜๊ฐ€ 0์ธ ์ƒํ™ฉ.
                                     # ์ฆ‰ ์•„๋ฌด ์ •์ ๋„ ์•ˆ๊ฑฐ์น˜๊ณ  v_i์—์„œ ์‹œ์ž‘์ •์ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ = ํ•ด๋‹น ๊ฐ„์„ ์˜ ๋น„์šฉ์ด ๋œ๋‹ค.
        dp[i][included] = w[i][0]
    
    if dp[i][included] < 0:		# ์ง€๊ธˆ ํ˜ธ์ถœ๋œ ๋ถ€๋ถ„๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ์ด ๊ตฌํ•ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด = ํ•ด๋‹น DPํ…Œ์ด๋ธ” ๊ณต๊ฐ„์ด ํ•œ ๋ฒˆ๋„ ๊ฑด๋“œ๋ ค์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋‹ค์‹œ ํ•˜์œ„ ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•ด ์ตœ์ ์„ ๊ตฌํ•œ๋‹ค.
        min_ = 1 << 32
        for j in range(1,n):
            if included & (1<<(j-1)) and w[i][j]:	# ๊ฐ ๋ถ€๋ถ„๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
            										# ์ค‘๊ด„ํ˜ธ ์•ˆ์— ํฌํ•จ๋œ ์ •์ ์˜ ์ž๋ฆฌ์ˆ˜๋Š” 1์ด๋‹ค.
                length = w[i][j] + go(j, included - (1<<(j-1)))
                if length < min_ : min_ = length
                
        dp[i][included] = min_
    
    return dp[i][included]

go(0, (1<<(n-1))-1)
print(dp[0][(1<<(n-1))-1])

ํ•จ์ˆ˜๊ฐ€ ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•ด top-down๋ฐฉ์‹์œผ๋กœ ๋ถ€๋ถ„๋ฌธ์ œ๋กœ ํŒŒ๊ณ ๋“ค์ง€๋งŒ, ๊ฒฐ๊ตญ DP ํ…Œ์ด๋ธ”์€ v_i : {} ์ธ ๊ฒฝ์šฐ๋ถ€ํ„ฐ, ์ฆ‰ bottom-up์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ฑ„์›Œ์ง์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค.

์ฐธ๊ณ ์‚ฌ์ดํŠธ

profile
I think I think too much.

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 10์›” 19์ผ

ใ…Žใ„ท ใ„ท

1๊ฐœ์˜ ๋‹ต๊ธ€