Home Week7 - Dijkstra
Post
Cancel

Week7 - Dijkstra

๐Ÿ“ ๋ฌธ์ œ ๋ชฉ๋ก


๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ ๊ฒƒ์œผ๋กœ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ง€์ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค๐Ÿ™


์‹œ์ž‘ํ•˜๊ธฐ ์ „์—: ์ตœ๋‹จ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์–ด์ค‘๊ฐ„ํ•œ ํƒ€์ด๋ฐ์— ์–˜๊ธฐ๋ฅผ ๊บผ๋‚ธ ๊ฒƒ ๊ฐ™์ง€๋งŒโ€ฆ โ€˜์ตœ๋‹จ๊ฒฝ๋กœโ€™๋ผ๋Š” ์ด๋ฆ„์˜ ๋ฌธ์ œ๊ฐ€ ๋‚˜์˜จ๊น€์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ตœ๋‹จ๊ฒฝ๋กœ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ด์•ผ๊ฒ ๋‹ค. ํ˜น์‹œ๋‚˜ ํ—ท๊ฐˆ๋ฆฌ๋˜ ๋ถ€๋ถ„๋„ ์ •๋ฆฌํ•  ๊ฒธ.
์ผ๋‹จ ๋ชจ๋“  ์ตœ๋‹จ๊ฒฝ๋กœ ๋ฌธ์ œ์—์„œ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์€ ๊ฒฐ๊ตญ ์ •์  A->B๊นŒ์ง€์˜ ๊ฒฝ๋กœ์ด๋‹ค.

  • ๋‹จ์ผ ์Œ(single-pair) ์ตœ๋‹จ๊ฒฝ๋กœ: ํ•œ ์ •์  A์—์„œ ๋‹ค๋ฅธ ํ•œ ์ •์  B๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ

์ด๋ฅผ ๊ธฐ๋ณธ ๋ชฉํ‘œ๋กœ ํ•˜์—ฌ ์ถœ๋ฐœ/๋„์ฐฉ์ •์ ์˜ ๊ฐ€์ง“์ˆ˜์— ๋”ฐ๋ผ ์•„๋ž˜์™€ ๊ฐ™์€ ์œ ํ˜•๋“ค๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

  • ๋‹จ์ผ ์ถœ๋ฐœ(single-source) ์ตœ๋‹จ๊ฒฝ๋กœ: ํ•œ ์ •์  A์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ.
  • ๋‹จ์ผ ๋„์ฐฉ(single-destination) ์ตœ๋‹จ๊ฒฝ๋กœ: ๋ชจ๋“  ์ •์ ์—์„œ ํ•œ ์ •์  A๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ. ๊ฐ„์„ ์˜ ๋ฐฉํ–ฅ์„ ๋ฐ˜๋Œ€๋กœ ํ•˜๋ฉด ๋‹จ์ผ ์ถœ๋ฐœ ์ตœ๋‹จ๊ฒฝ๋กœ ๋ฌธ์ œ์™€ ๊ฐ™๋‹ค.
  • ์ „์ฒด ์Œ(all-pair) ์ตœ๋‹จ๊ฒฝ๋กœ: ๋ชจ๋“  ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.
(์ด๋•Œ ๊ฐ„์„ ์— ๋ฐฉํ–ฅ์ด๋‚˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š”์ง€, ๊ฐ€์ค‘์น˜์— ์Œ์ˆ˜๊ฐ€ ํฌํ•จ๋˜๋Š”์ง€, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์€์ง€ ์ ์€์ง€ ๋“ฑ ๊ทธ๋ž˜ํ”„์˜ ๊ฐ„์„ ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ์„œ๋„ ์‚ฌ์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค.)

  • BFS: ๊ฐ€์ค‘์น˜๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ
  • ๋‹ค์ต์ŠคํŠธ๋ผ: (์Œ์˜ ๊ฐ’์ด ์—†๋Š”)๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” ๋‹จ์ผ ์ถœ๋ฐœ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ
  • ๋ฒจ๋งŒ ํฌ๋“œ: ๋ฐฉํ–ฅ,๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” ๋‹จ์ผ ์ถœ๋ฐœ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ(์Œ์˜ ์‚ฌ์ดํด์„ ์ฃผ์˜)
  • A*: ๋‹จ์ผ ์Œ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ(ํƒ์ƒ‰ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ํœด๋ฆฌ์Šคํ‹ฑ ์‚ฌ์šฉ)
  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ: ์ „์ฒด ์Œ ์ตœ๋‹จ๊ฒฝ๋กœ ๊ตฌํ•˜๊ธฐ(๋‹จ ์Œ์˜ ์‚ฌ์ดํด์ด ์—†์–ด์•ผ ํ•จ)


1. ์ตœ๋‹จ๊ฒฝ๋กœ

์ด๋ฒˆ ์ฃผ์ฐจ๋Š” ์–ด์ฉŒ๋‹ค ํฌ์ŠคํŒ…์„ ๊ณ„์†ํ•ด์„œ ๋ฏธ๋ฃฌ ํƒ“์— ๋ฌธ์ œํ’€๋•Œ์˜ ๊ธฐ์–ต์ด ๊ฑฐ์˜ ์‚ฌ๋ผ์ ธ์„œ ์•„๋ฌด๋ž˜๋„ ํ’€๋˜ ๋‹น์‹œ์˜ ์ƒ๊ฐ์ด๋‚˜ ํ—ค๋งธ๋˜ ์ ์„ ๋‹ค ์ ๊ธฐ๋Š” ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹คใ… ใ… 

์ด ๋ฌธ์ œ๋Š” ์ž์—ฐ์ˆ˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ฐ„์„ ์„ ๊ฐ–๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๋‹จ์ผ ์ถœ๋ฐœ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š”, ์•„์ฃผ ๋Œ€ํ‘œ์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ์ด๋‹ค.
๋จผ์ € ์ƒ๊ฐํ•ด์•ผ ํ•  ๊ฒƒ์€ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์•„์ง ํ™•์ธ๋˜์ง€ ์•Š์€ ๋‘ ์ •์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์–ด๋–ค ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•˜๋ƒ๋Š” ๊ฒƒ์ธ๋ฐ, INF(๋ฌดํ•œ๋Œ€)๋กœ ์ง€์ •ํ•ด๋†“์œผ๋ฉด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ๋” ์งง์€ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ ๊ฐฑ์‹ ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
์•„๋ฌดํŠผ ๊ทธ๋Ÿฌ๊ณ ๋‚˜์„œ ๋ชจ๋“  ์ •์ ์— ๋Œ€ํ•˜์—ฌ โ€˜์‹œ์ž‘์  K์—์„œ๋ถ€ํ„ฐ ์ •์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ(์ดํ•˜ dist)โ€™๋ฅผ ๊ฐฑ์‹ ํ•ด๋‚˜๊ฐ„๋‹ค. ๋งคํšŒ ๋ฏธ๋ฐฉ๋ฌธ ์ •์  ์ค‘ K์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด๊ณณ ์ฆ‰ dist๊ฐ€ ์ตœ์†Œ์ธ ์ •์ ์„ ์ฐพ์•„ ๊ทธ์™€ ์ธ์ ‘ํ•œ ์ •์ ๋“ค์˜ dist๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1
2
3
โ‘  ๋ชจ๋“  ๊ฐ„์„ ๋“ค์„ ํ•œ๋ฒˆ์”ฉ ๊ฒ€์‚ฌ => O(E)
โ‘ก ๋ฏธ๋ฐฉ๋ฌธ ์ •์  ์ค‘ dist๊ฐ€ ์ตœ์†Œ์ธ ์ •์  ์ฐพ๊ธฐ => O(ElogE)
๋”ฐ๋ผ์„œ O(E + ElogE) = O(ElogE) (*๋Œ€๊ฐœ์˜ ๊ฒฝ์šฐ E<V^2์ด๋ฏ€๋กœ O(ElogV)๋ผ๊ณ  ๋ณด๋Š”๋“ฏํ•˜๋‹ค.)

์—ฌ๊ธฐ์„œ โ‘ก๋Š” ์ธ์ ‘๋ฆฌ์ŠคํŠธ์™€ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„์ด๋‹ค.
์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋งค๋ฒˆ ๋ชจ๋“  ์ •์ ์˜ dist๋ฅผ ๋น„๊ตํ•˜๋Š” ์‹์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ (O(V^2)), ์ •์ ์˜ ์ˆ˜๊ฐ€ ์ ๊ฑฐ๋‚˜ ๊ฐ„์„ ์ด ๋งค์šฐ ๋งŽ์€ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ ์ด์ƒ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋น ๋ฅด๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•ด ์ •์  i์— ๋Œ€ํ•ด (dist[i], i)๋ฅผ ์ €์žฅํ•˜์—ฌ dist๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ์ด๋ฏ€๋กœ ํ์— ๋„ฃ์„ ๋•Œ dist[i]์— ๋งˆ์ด๋„ˆ์Šค๋ฅผ ๊ณฑํ•ด์ฃผ๊ฑฐ๋‚˜ ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜๋„๋ก ์จ์ฃผ์–ด์•ผ ํ•œ๋‹ค. (์•„๋ž˜ ์ฝ”๋“œ ์ฐธ๊ณ )
ํ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ธฐ์ค€์€ โ€˜๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐฑ์‹ ๋˜์—ˆ์„ ๋•Œโ€™ ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ข€ ํ—ท๊ฐˆ๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค. ๋ฐ”๋กœ โ€œ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?โ€์— ๋Œ€ํ•œ ๋ฌธ์ œ์˜€๋Š”๋ฐ, ์ฝ”๋“œ์—์„œ๋„ ๋ณด์ด๋“ฏ์ด ์‚ฌ์‹ค ๋‚˜๋Š” ๊ตณ์ด ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๋”ฐ๋กœ ๋ญ”๊ฐ€๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•˜์—ˆ๋‹ค.
์™œ๋ƒํ•˜๋ฉด ํ์— ๊ฐ™์€ ์ •์ ์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋“ค์–ด๊ฐ€๋”๋ผ๋„ ์ตœ์ดˆ pop๋˜์—ˆ์„ ๋•Œ ์ด๋ฏธ ์ธ์ ‘์ •์ ์— ๋Œ€ํ•œ ์ตœ์ข… dist๋ฅผ ๊ตฌํ•ด๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์ดํ›„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋”๋ผ๋„ ์ธ์ ‘์ •์ ์˜ dist๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ  ํ์— ๋„ฃ๋Š” ์ผ์€ ์–ด์ฐจํ”ผ ์—†์„ ๊ฒƒ์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋ฌผ๋ก  ์•„๋ž˜ ์ฝ”๋“œ๋กœ๋„ ํ†ต๊ณผํ•˜๊ธด ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋”๋ผ๋„ ์–ด์จŒ๋“  pop๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ์ •์ ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ธ์ ‘์ •์ ์„ ๊ฒ€์‚ฌํ•˜๊ธฐ๋Š” ํ•  ๊ฒƒ์ด๋‹ˆ ๋ฌด์˜๋ฏธํ•œ ์ž‘์—…์œผ๋กœ ์‹คํ–‰์‹œ๊ฐ„์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ธ์ ‘์ •์  ๊ฒ€์‚ฌ ์ „ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด๋ฌธ์€ ์ถ”๊ฐ€ํ•ด์ฃผ๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๋ญ bool ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•ด์„œ ์ฒดํฌ๋ฅผ ํ•˜๋“ ์ง€, ์•„๋ž˜ ์ฝ”๋“œ ์ฃผ์„์ฒ˜๋Ÿผ dist ๊ฐ’์„ ๋น„๊ตํ•˜๋“ ์ง€โ€ฆ
(์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ ๊ธ€)

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

const int INF = 99999999;
int dist[20001];
vector<pair<int, int>> adj[20001];	// (์ธ์ ‘)์ •์ ๋ฒˆํ˜ธ, ๊ฐ€์ค‘์น˜
priority_queue< pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq;	// dist[์ •์ ], ์ •์ ๋ฒˆํ˜ธ


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int v, e, k;
	cin >> v >> e >> k;

	fill_n(&dist[1], v, INF);

	for (int i = 0; i < e; i++) {
		int f, t, d;
		cin >> f >> t >> d;
		adj[f].push_back({ t,d });
	}

	// ์‹œ์ž‘๋…ธ๋“œ
	dist[k] = 0;
	pq.push({ 0, k });


	while (!pq.empty()) {
		int cur = pq.top().second;
		int cur_dist = pq.top().first;
		pq.pop();
		
		// * ์ด๋•Œ dist[cur]<cur_dist๋ผ๋ฉด continue ํ•ด์ฃผ๊ธฐ

		for (int i = 0; i < adj[cur].size(); i++) {
			int next = adj[cur][i].first;
			int next_adj = adj[cur][i].second;
			if (cur_dist + next_adj < dist[next]) {
				dist[next] = cur_dist + next_adj;
				pq.push({ dist[next], next });
			}
		}
	}

	for (int i = 1; i <= v; i++) {
		if (dist[i] == INF) cout << "INF";
		else cout << dist[i];
		cout << "\n";
	}
}


2. ํ•ดํ‚น

์ปดํ“จํ„ฐ์˜ ์ˆ˜์™€ ์ปดํ“จํ„ฐ๋“ค๋ผ๋ฆฌ์˜ ์˜์กด์„ฑ ์ •๋ณด, ๊ทธ๋ฆฌ๊ณ  ๋งจ ์ฒ˜์Œ ํ•ดํ‚น๋‹นํ•œ ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ์ด ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ ์ˆ˜์™€ ๋งˆ์ง€๋ง‰ ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ๋˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
์œ„ ๋ฌธ์ œ์™€ ๋น„์Šทํ•œ๋ฐ ์›ƒ๊ธด๊ฑด ์—ฌ๊ธฐ์„œ๋Š” ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•ด์คฌ์œผ๋ฉด์„œ ๋˜ ์กฐ๊ฑด๋ฌธ์€ ์•ˆ ๋„ฃ์–ด์คฌ๋‹ค๋Š”๊ฑฐ๋‹ค=_=;; ๊ทธ๋Ÿผ ์™œ์“ด๊ฑธ๊นŒโ€ฆ์นด์šดํŠธ๋•Œ๋ฌธ์— ๋„ฃ์€๊ฑด์ง€โ€ฆ๊ทผ๋ฐ ์–ด์ฐจํ”ผ ๋งˆ์ง€๋ง‰์— INF ์•„๋‹ˆ๋ฉด ์˜ฌ๋ฆฌ๋ฉด ๋˜๋Š”๋ฐ ๊ตณ์ด?ใ…‹ใ…‹ ์•”ํŠผโ€ฆ๋งˆ์ง€๋ง‰ ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ๋˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ ์ค‘ ๊ฐ€์žฅ ๋จผ ๊ฒƒ์˜ ๊ฐ์—ผ์‹œ๊ฐ„์ผ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋งค ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋งˆ๋‹ค ๋ฐฐ์—ด ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ์žŠ์ง€ ์•Š์•˜๋‹ค.

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<iostream>
#include<vector>
#include<queue>

using namespace std;

// ๋ฐฉํ–ฅ, ๊ฐ€์ค‘์น˜ ์žˆ์Œ

const int INF = 99999999;
bool is_infected[10001];
int time[10001];
vector<pair<int, int>> adj[10001];	// ๊ฐ€์ค‘์น˜(a->b ๊ฐ์—ผ์‹œ๊ฐ„), (์ธ์ ‘)์ •์ ๋ฒˆํ˜ธ
priority_queue< pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>> > pq;	// time[์ •์ ], ์ •์ ๋ฒˆํ˜ธ

void dijkstra() {
	int cnt = 0;
	int end_time = 0;

	int n, d, c;
	cin >> n >> d >> c;

	fill_n(&is_infected[1], n, false);
	fill_n(&time[1], n, INF);
	for (int i = 1; i <= n; i++) {
		adj[i].clear();
	}

	for (int i = 0; i < d; i++) {
		int a, b, s;
		cin >> a >> b >> s;
		adj[b].push_back({ s,a });
	}

	// ์‹œ์ž‘์ •์ 
	time[c] = 0;
	pq.push({ time[c],c });

	while (!pq.empty()) {
		int cur = pq.top().second;
		int cur_t = pq.top().first;
		pq.pop();
		
		// * ๊ฐ์—ผ๋˜์—ˆ์œผ๋ฉด continue

		is_infected[cur] = true;

		for (int i = 0; i < adj[cur].size(); i++) {
			int next = adj[cur][i].second;
			int next_t = adj[cur][i].first;

			if (cur_t + next_t < time[next]) {
				time[next] = cur_t + next_t;
				pq.push({ time[next],next });
			}
		}
	}

	for (int i = 1; i <= n; i++) {
		if (is_infected[i]) cnt++;
		if (time[i] < INF && time[i] > end_time) {
			end_time = time[i];
		}
	}

	cout << cnt << " " << end_time << "\n";
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int num;
	cin >> num;

	for (int i = 0; i < num; i++) {
		dijkstra();
	}
}


3. ๋…น์ƒ‰ ์˜ท ์ž…์€ ์• ๊ฐ€ ์ ค๋‹ค์ง€?๐Ÿ˜‚

๊ฐ ์นธ์„ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ์žƒ๋Š” ๊ธˆ์•ก์ด ์ ํžŒ Nร—N ํฌ๊ธฐ ๋งต์ด ์ฃผ์–ด์ง€๋ฉด, ์™ผ์ชฝ ์œ„ ๋์—์„œ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋์œผ๋กœ ๊ฐˆ ๋•Œ๊นŒ์ง€ ์ตœ์†Œํ•œ ์–ผ๋งˆ๋ฅผ ์žƒ๊ฒŒ ๋˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์œ„ ๋‘ ๋ฌธ์ œ๋“ค๊ณผ ๋‹ฌ๋ฆฌ ๊ฐ ์นธ์— ๊ฐ’์ด ์ฃผ์–ด์ ธ์žˆ๊ณ  ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์‚ดํŽด๋ณด๋Š” ํ˜•์‹์˜ ๋ฌธ์ œ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ์„  ์ƒํ•˜์ขŒ์šฐ๋ฅผ ์ฐจ๋ก€๋กœ ๋“ค๋ฆฌ๊ธฐ ์œ„ํ•ด x,y ์ด๋™์ขŒํ‘œ๋ฅผ ๋‹ด์€ dir ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์ดํ›„ ์กฐ๊ฑด๋ฌธ์—์„œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋“ค๋ €์„ ๋•Œ ๊ทธ ์นธ์ด ๋งต ๋‚ด์— ์žˆ๋Š” ์นธ์ธ์ง€๋„ ๊ฒ€์‚ฌํ•ด์คฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์นธ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ค‘์น˜๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ, ์‹œ์ž‘์ ์—์„œ ์–ด๋–ค ์นธ๊นŒ์ง€ ๊ฐ€๋Š” ๋ฐ ์žƒ๋Š” ์ตœ์†Œ ๊ธˆ์•ก์„ result๋ผ๊ณ  ํ–ˆ์„ ๋•Œ
๋‹ค์Œ ์นธ์˜ result๋ณด๋‹ค ์ง€๊ธˆ ๋ฐŸ๊ณ ์žˆ๋Š” ์นธ์„ ํ†ตํ•ด ๋‹ค์Œ ์นธ์œผ๋กœ ๊ฐ”์„๋•Œ์˜ ๊ธˆ์•ก์ด ๋” ์ ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ๊ฐฑ์‹ ํ•จ๊ณผ ๋™์‹œ์— ๋‹ค์Œ ์นธ์˜ ์ขŒํ‘œ๋ฅผ ํ์— ๋„ฃ๋„๋ก ํ–ˆ๋‹ค.
์ด๋•Œ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ํ•œ๋ฒˆ ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋„๋ก ์กฐ๊ฑด๋ฌธ์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๊ณ ๋‚˜์„œ (n,n)์ขŒํ‘œ์˜ result๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ํ‘œํ˜„์ด๋‚˜ ์ถœ๋ ฅํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅผ ๋ฟ ๊ฒฐ๊ตญ ์ตœ์†Œ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๊ฑด ๋˜‘๊ฐ™๋‹ค.

์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
#include<queue>

using namespace std;

const int INF = 99999999;

int main() {
	int num = 1;
	int lost[126][126];
	int dir[4][2] = { {-1,0},{0,-1},{0,1},{1,0} };
	priority_queue<pair<int, pair<int, int>>> pq;	// x, y

	while (true) {
		int n;
		int result[126][126];
		cin >> n;
		if (n == 0) break;

		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				cin >> lost[i][j];
			}
		}

		for (int i = 1; i <= n; i++) {
			fill_n(&result[i][1], n, INF);
		}

		result[1][1] = lost[1][1];
		pq.push({ -lost[1][1], { 1,1 } });

		while (!pq.empty()) {
			int cur_res = -pq.top().first;
			int cur_x = pq.top().second.first;
			int cur_y = pq.top().second.second;
			pq.pop();
			if (result[cur_x][cur_y] < cur_res) continue;

			for (int i = 0; i < 4; i++) {
				int next_x = cur_x + dir[i][0];
				int next_y = cur_y + dir[i][1];

				if (next_x > 0 && next_x <= n && next_y > 0 && next_y <= n &&
					cur_res + lost[next_x][next_y] < result[next_x][next_y]) {
					result[next_x][next_y] = result[cur_x][cur_y] + lost[next_x][next_y];
					pq.push({ -result[next_x][next_y], { next_x,next_y } });
				}
			}
		}

		cout << "Problem " << num++ << ": " << result[n][n] << "\n";
	}
}
This post is licensed under CC BY 4.0 by the author.

[Unity Graphics Study] 4. Shader(1)

5719 : ๊ฑฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

Comments powered by Disqus.