[๐Ÿ“š์ด์ฝ”ํ…Œ #6] ์ตœ๋‹จ ๊ฒฝ๋กœ ๐Ÿ”ฅ

์ตœํ˜ธ๋นˆยท2023๋…„ 5์›” 6์ผ
0
post-thumbnail

์ถœ์ฒ˜ : https://www.youtube.com/watch?v=acqm9mM1P6o&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=7


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

  • ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ์ƒํ™ฉ
    โ€ข ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ํ•œ ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ
    โ€ข ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ
    โ€ข ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

๐Ÿ‘‰๐Ÿป ๊ฐ ์ง€์ ์€ ๊ทธ๋ž˜ํ”„์—์„œ ๋…ธ๋“œ๋กœ ํ‘œํ˜„
๐Ÿ‘‰๐Ÿป ์ง€์  ๊ฐ„ ์—ฐ๊ฒฐ๋œ ๋„๋กœ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„



๐Ÿ“Œ ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜


๊ฐœ์š”

  • ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์˜ ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
    ๐Ÿ‘‰๐Ÿป ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋„๋กœ(๊ฐ„์„ )์€ ์Œ์˜ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š๋Š”๋‹ค. So, ํ˜„์‹ค์„ธ๊ณ„์˜ ๊ธธ ์ฐพ๊ธฐ ๋ฌธ์ œ๋กœ ๋งŽ์ด ์ถœ์ œ
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.
    ๐Ÿ‘‰๐Ÿป ๋งค ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ์ž„์˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

โœ… ๋‹ค๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜๋˜๊ธฐ๋„ ํ•œ๋‹ค. A โžก๏ธ C ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ์— B๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋‹ค๊ณ  ํ•˜๋ฉด A โžก๏ธ B ์ตœ๋‹จ ๊ฒฝ๋กœ์™€ B โžก๏ธ C ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธธ์ฐพ๊ธฐ ๋ฌธ์ œ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์›๋ฆฌ๊ฐ€ ์ ์šฉ๋œ ๋ฌธ์ œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ํ•˜์ง€๋งŒ ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํƒ์š•์ ์ธ ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฏ€๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.


๋™์ž‘ ๊ณผ์ •

1๏ธโƒฃ ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
2๏ธโƒฃ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (์ž๊ธฐ ์ž์‹ ์— ๋Œ€ํ•œ ๋…ธ๋“œ๋Š” 0, ์ž์‹  โžก๏ธ ์ž์‹  ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์ด๋ฏ€๋กœ)
3๏ธโƒฃ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
4๏ธโƒฃ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
5๏ธโƒฃ ์œ„ ๊ณผ์ •์—์„œ 3๋ฒˆ๊ณผ 4๋ฒˆ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.


์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ •์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ฉด '์ด์ œ๋ถ€ํ„ฐ๋Š” ์ด ๊ฒฝ๋กœ๊ฐ€ ์ œ์ผ ์งง์€ ๊ฒฝ๋กœ์•ผ' ๋ผ๊ณ  ๊ฐฑ์‹ ํ•œ๋‹ค.

โฌ‡๏ธ ๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•˜์œผ๋ฏ€๋กœ ๊ฐฑ์‹ 


๐Ÿ‘€ ๋™์ž‘ ๊ณผ์ • ์‚ดํŽด๋ณด๊ธฐ

[์ดˆ๊ธฐ ์ƒํƒœ] ๊ทธ๋ž˜ํ”„๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ์„ค์ •ํ•œ๋‹ค.


[Step 1] ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.


[Step 2] ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.


[Step 3] ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.


[Step 4] ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 5๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.


[Step 5] ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 3๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.


[Step 6] ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ์ธ 6๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์‚ฌ์‹ค ์ˆ˜ํ–‰ ์•ˆํ•ด๋„ ๋œ๋‹ค. ๋˜ํ•œ 6๋ฒˆ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฐ„์„ ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„ ์• ์ดˆ์— ํ…Œ์ด๋ธ”์ด ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š”๋‹ค.


ํŠน์ง•

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



1๏ธโƒฃ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค 1์ฐจ์› ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ™•์ธ(์ˆœ์ฐจ ํƒ์ƒ‰)ํ•œ๋‹ค.


python

import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n + 1)]
# ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
visited = [False] * (n + 1)
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n + 1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
    graph[a].append((b, c))

# ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
def get_smallest_node():
    min_value = INF
    index = 0 # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
    for i in range(1, n + 1):
        if distance[i] < min_value and not visited[i]:
            min_value = distance[i]
            index = i
    return index

def dijkstra(start):
    # ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
    distance[start] = 0
    visited[start] = True
    for j in graph[start]:
        distance[j[0]] = j[1]
    # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n - 1๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
    for i in range(n - 1):
        # ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        now = get_smallest_node()
        visited[now] = True
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
        for j in graph[now]:
            cost = distance[now] + j[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[j[0]]:
                distance[j[0]] = cost

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
for i in range(1, n + 1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    else:
        print(distance[i])

Java

import java.util.*;

class Node {

    private int index;
    private int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    public int getIndex() {
        return this.index;
    }

    public int getDistance() {
        return this.distance;
    }
}

public class Main {

    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ(Start)
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
    public static int n, m, start;
    // ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
    public static ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>();
    // ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
    public static boolean[] visited = new boolean[100001];
    // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
    public static int[] d = new int[100001];

    // ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
    public static int getSmallestNode() {
        int min_value = INF;
        int index = 0; // ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
        for (int i = 1; i <= n; i++) {
            if (d[i] < min_value && !visited[i]) {
                min_value = d[i];
                index = i;
            }
        }
        return index;
    }

    public static void dijkstra(int start) {
        // ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
        d[start] = 0;
        visited[start] = true;
        for (int j = 0; j < graph.get(start).size(); j++) {
            d[graph.get(start).get(j).getIndex()] = graph.get(start).get(j).getDistance();
        }
        // ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n - 1๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
        for (int i = 0; i < n - 1; i++) {
            // ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
            int now = getSmallestNode();
            visited[now] = true;
            // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
            for (int j = 0; j < graph.get(now).size(); j++) {
                int cost = d[now] + graph.get(now).get(j).getDistance();
                // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
                if (cost < d[graph.get(now).get(j).getIndex()]) {
                    d[graph.get(now).get(j).getIndex()] = cost;
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        start = sc.nextInt();

        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Node>());
        }

        // ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            // a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
            graph.get(a).add(new Node(b, c));
        }

        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        Arrays.fill(d, INF);

        // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
        dijkstra(start);

        // ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        for (int i = 1; i <= n; i++) {
            // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
            if (d[i] == INF) {
                System.out.println("INFINITY");
            }
            // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
            else {
                System.out.println(d[i]);
            }
        }
    }
}

์„ฑ๋Šฅ ๋ถ„์„

์ด 0(V)๋ฒˆ์— ๊ฑธ์ณ์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๋งค๋ฒˆ ์„ ํ˜• ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” 0(V^2)์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ์—์„œ ์ „์ฒด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 5,000๊ฐœ ์ดํ•˜๋ผ๋ฉด ์ด ์ฝ”๋“œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 10,000๊ฐœ๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ๋ฌธ์ œ๋ผ๋ฉด โ“ 1์–ต์ด ๋„˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์šฐ์„ ์ˆœ์œ„ ํ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.


โœ๏ธ ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)

  • ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฃŒ๊ตฌ์กฐ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ฌผ๊ฑด ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊บผ๋‚ด์„œ ํ™•์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Python, C++, Java๋ฅผ ํฌํ•จํ•œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๋กœ ์ง€์›ํ•œ๋‹ค.


ํž™(Heap)

  • ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ์ตœ์†Œ ํž™(Min Heap)๊ณผ ์ตœ๋Œ€ ํž™(Max Heap)์ด ์žˆ๋‹ค.
  • ์ตœ์†Œ ํž™(Min Heap)์€ ๊ฐ’์ด ๋‚ฎ์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ  ์ตœ๋Œ€ ํž™(Max Heap)์€ ๊ฐ’์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํฌํ•จํ•ด ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ‘‰๐Ÿป ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋ฆฌ์ŠคํŠธ์— ๋น„ํ•ด O(logN)์ด๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ํšจ๊ณผ์ ์ด๋‹ค.


์ตœ์†Œํž™

import heapq

# ์˜ค๋ฆ„์ฐจ์ˆœ ํž™ ์ •๋ ฌ(Heap Sort)
def heapsort(iterable):
    h = []
    result = []
    # ๋ชจ๋“  ์›์†Œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ํž™์— ์‚ฝ์ž…
    for value in iterable:
        heapq.heappush(h, value)
    # ํž™์— ์‚ฝ์ž…๋œ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊บผ๋‚ด์–ด ๋‹ด๊ธฐ
    for i in range(len(h)):
        result.append(heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)

# ๊ฒฐ๊ณผ : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

์ตœ๋Œ€ํž™

import heapq

# ๋‚ด๋ฆผ์ฐจ์ˆœ ํž™ ์ •๋ ฌ(Heap Sort)
def heapsort(iterable):
    h = []
    result = []
    # ๋ชจ๋“  ์›์†Œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ํž™์— ์‚ฝ์ž…
    for value in iterable:
        heapq.heappush(h, -value) # ๋ถ€ํ˜ธ๋ฅผ ๋ฐ”๊ฟ”์„œ ๋„ฃ์–ด์คŒ
    # ํž™์— ์‚ฝ์ž…๋œ ๋ชจ๋“  ์›์†Œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊บผ๋‚ด์–ด ๋‹ด๊ธฐ
    for i in range(len(h)):
        result.append(-heapq.heappop(h)) # ๋ถ€ํ˜ธ๋ฅผ ๋ฐ”๊ฟ”์„œ ์‚ฝ์ž…
    return result

result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)

# ๊ฒฐ๊ณผ : [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]



2๏ธโƒฃ ๊ฐœ์„ ๋œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ํž™(Heap) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ž‘ํ•˜๋Š” ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” ๋™์ผํ•˜๋‹ค.
    ๐Ÿ‘‰๐Ÿป ๋‹ค๋งŒ, ํ˜„์žฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•ด ๋†“๊ธฐ ์œ„ํ•ด์„œ ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ด์šฉํ•œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.
    ๐Ÿ‘‰๐Ÿป ํ˜„์žฌ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ตœ์†Œ ํž™์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋™์ž‘ ๊ณผ์ • (์šฐ์„ ์ˆœ์œ„ ํ)

[์ดˆ๊ธฐ ์ƒํƒœ] ๊ทธ๋ž˜ํ”„๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. 1 ์—์„œ 1 ๊นŒ์ง€๋Š” 0์ด๋ฏ€๋กœ ๊ฑฐ๋ฆฌ๋Š” 0์ด๋‹ค.


[Step 1] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 1๋ฒˆ ๋…ธ๋“œ๋Š” ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฑฐ์ณ๊ฐˆ ๋•Œ์˜ ๊ฐ’์ด ํ˜„์žฌ ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. ๋˜ํ•œ ๊ฐฑ์‹ ๋  ๋•Œ๋งŒ ํ์— ํ•ด๋‹น ๊ฐฑ์‹ ๋œ ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ๋‹ด์•„์ค€๋‹ค.

๊ทธ๋ฆผ์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์ชฝ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ๊ทธ๋ ค์ฃผ์—ˆ๋‹ค.


[Step 2] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ(ํ ์ œ์ผ ์œ„์— ์žˆ๋Š” 4๋ฒˆ ๋…ธ๋“œ)๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 4๋ฒˆ ๋…ธ๋“œ๋Š” ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ 4๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•˜์—ฌ 3์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ(1 -> 4 -> 3)๊ณผ 5(1 -> 4 -> 5)๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•œ ํ›„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.


[Step 3] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 2๋ฒˆ ๋…ธ๋“œ๋Š” ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ 2๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•˜์—ฌ 3์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ(1 -> 2 -> 3)๊ณผ 4(1 -> 2 -> 4)๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐ ํ›„ ๊ฐฑ์‹ ํ•˜๋ ค ํ–ˆ์ง€๋งŒ ์›๋ž˜ ๊ฐ’๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ด๋ธ”๊ณผ ์šฐ์„ ์ˆœ์œ„ ํ ๋˜ํ•œ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


[Step 4] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 5๋ฒˆ ๋…ธ๋“œ๋Š” ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 5๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์ด 1 + 1 = 2๋กœ ๊ฐฑ์‹ ๋˜๊ณ , ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์ธ 3๊ณผ 6์˜ ์ตœ์†Œ ๋น„์šฉ๋˜ํ•œ ๊ฐฑ์‹ ๋œ๋‹ค.


[Step 5] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 3๋ฒˆ ๋…ธ๋“œ๋Š” ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


[Step 6] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 3๋ฒˆ ๋…ธ๋“œ๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.


[Step 7] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 6๋ฒˆ ๋…ธ๋“œ๋Š” ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


[Step 8] ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋ƒ…๋‹ˆ๋‹ค. 3๋ฒˆ ๋…ธ๋“œ๋Š” ์ด๋ฏธ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋Š” ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๊ฐ’๋ณด๋‹ค ๊บผ๋‚ธ ์›์†Œ์˜ ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด ๋ฐฉ๋ฌธํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.



python

import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n + 1)]
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n + 1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
    graph[a].append((b, c))

def dijkstra(start):
    q = []
    # ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
    heapq.heappush(q, (0, start))
    distance[start] = 0
    while q: # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
        if distance[now] < dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
for i in range(1, n + 1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    else:
        print(distance[i])

Java

import java.util.*;

class Node implements Comparable<Node> {

    private int index;
    private int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    public int getIndex() {
        return this.index;
    }

    public int getDistance() {
        return this.distance;
    }

    // ๊ฑฐ๋ฆฌ(๋น„์šฉ)๊ฐ€ ์งง์€ ๊ฒƒ์ด ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋„๋ก ์„ค์ •
    @Override
    public int compareTo(Node other) {
        if (this.distance < other.distance) {
            return -1;
        }
        return 1;
    }
}

public class Main {

    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ(Start)
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100,000๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
    public static int n, m, start;
    // ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
    public static ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>();
    // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
    public static int[] d = new int[100001];

    public static void dijkstra(int start) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        // ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
        pq.offer(new Node(start, 0));
        d[start] = 0;
        while(!pq.isEmpty()) { // ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
            // ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
            Node node = pq.poll();
            int dist = node.getDistance(); // ํ˜„์žฌ ๋…ธ๋“œ๊นŒ์ง€์˜ ๋น„์šฉ 
            int now = node.getIndex(); // ํ˜„์žฌ ๋…ธ๋“œ
            // ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
            if (d[now] < dist) continue;
            // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
            for (int i = 0; i < graph.get(now).size(); i++) {
                int cost = d[now] + graph.get(now).get(i).getDistance();
                // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
                if (cost < d[graph.get(now).get(i).getIndex()]) {
                    d[graph.get(now).get(i).getIndex()] = cost;
                    pq.offer(new Node(graph.get(now).get(i).getIndex(), cost));
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        start = sc.nextInt();

        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Node>());
        }
    
        // ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        for (int i = 0; i < m; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            // a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
            graph.get(a).add(new Node(b, c));
        }

        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        Arrays.fill(d, INF);
      
        // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
        dijkstra(start);

        // ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        for (int i = 1; i <= n; i++) {
            // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
            if (d[i] == INF) {
                System.out.println("INFINITY");
            }
            // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
            else {
                System.out.println(d[i]);
            }
        }
    }
}

์„ฑ๋Šฅ ๋ถ„์„

  • ํž™ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(ElogV)์ด๋‹ค.
  • ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ˜๋ณต๋ฌธ(while๋ฌธ)์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ V ์ด์ƒ์˜ ํšŸ์ˆ˜๋กœ๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ˜„์žฌ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์„ ํ™•์ธํ•˜๋Š” ์ด ํšŸ์ˆ˜๋Š” ์ตœ๋Œ€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(E)๋งŒํผ ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ง๊ด€์ ์œผ๋กœ ์ „์ฒด ๊ณผ์ •์€ E๊ฐœ์˜ ์›์†Œ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์—ˆ๋‹ค๊ฐ€ ๋ชจ๋‘ ๋นผ๋‚ด๋Š” ์—ฐ์‚ฐ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค.
    • ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ O(ElogE)๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ค‘๋ณต ๊ฐ„์„ ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์ด๋ฅผ O(ElogV)๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

      O(ElogE) โžก๏ธ O(ElogV^2) โžก๏ธ O(2ElogV) โžก๏ธ O(ElogV)




๐Ÿ“Œ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜


๊ฐœ์š”

  • ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ(Floyd-Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹จ๊ณ„๋ณ„๋กœ ๊ฑฐ์ณ ๊ฐ€๋Š” ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋‹ค๋งŒ ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ์€ 2์ฐจ์› ํ…Œ์ด๋ธ”์— ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์œ ํ˜•์— ์†ํ•œ๋‹ค.
  • ๋…ธ๋“œ์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ๋งŽ์„ ๋•Œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ๋‹ค.

  • ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ํŠน์ •ํ•œ ๋…ธ๋“œ k๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • a์—์„œ b๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ณด๋‹ค a์—์„œ k๋ฅผ ๊ฑฐ์ณ b๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

์ ํ™”์‹์€ ์•„๋ž˜๊ณผ ๊ฐ™๋‹ค.


๋™์ž‘ ๊ณผ์ •

[์ดˆ๊ธฐ ์ƒํƒœ] ๊ทธ๋ž˜ํ”„๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋งŒ ํ™•์ธํ•ด์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ์ด๋•Œ, ํ–‰ = ์ถœ๋ฐœ๋…ธ๋“œ, ์—ด = ๋„์ฐฉ ๋…ธ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.


[STEP 1] 1๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
0 : ์ž๊ธฐ ์ž์‹  โžก๏ธ ์ž๊ธฐ ์ž์‹ ์ธ ๊ฒฝ์šฐ


[STEP 2] 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.


[STEP 3] 3๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.


[STEP 4] 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.


python

INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ๋ฐ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n = int(input())
m = int(input())
# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ(๊ทธ๋ž˜ํ”„ ํ‘œํ˜„)๋ฅผ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  ๊ฐ’์„ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
graph = [[INF] * (n + 1) for _ in range(n + 1)]

# ์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for a in range(1, n + 1):
    for b in range(1, n + 1):
        if a == b:
            graph[a][b] = 0

# ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„, ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
for _ in range(m):
    # A์—์„œ B๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ C๋ผ๊ณ  ์„ค์ •
    a, b, c = map(int, input().split())
    graph[a][b] = c

# ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
for k in range(1, n + 1):
    for a in range(1, n + 1):
        for b in range(1, n + 1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

# ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
for a in range(1, n + 1):
    for b in range(1, n + 1):
        # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
        if graph[a][b] == 1e9:
            print("INFINITY", end=" ")
        # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        else:
            print(graph[a][b], end=" ")
    print()

Java

import java.util.*;

public class Main {

    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M)
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 500๊ฐœ๋ผ๊ณ  ๊ฐ€์ •
    public static int n, m;
    // 2์ฐจ์› ๋ฐฐ์—ด(๊ทธ๋ž˜ํ”„ ํ‘œํ˜„)๋ฅผ ๋งŒ๋“ค๊ธฐ
    public static int[][] graph = new int[501][501];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();

        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < 501; i++) {
            Arrays.fill(graph[i], INF);
        }

        // ์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (a == b) graph[a][b] = 0;
            }
        }

        // ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„, ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < m; i++) {
            // A์—์„œ B๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ C๋ผ๊ณ  ์„ค์ •
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();
            graph[a][b] = c;
        }

        // ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
        for (int k = 1; k <= n; k++) {
            for (int a = 1; a <= n; a++) {
                for (int b = 1; b <= n; b++) {
                    graph[a][b] = Math.min(graph[a][b], graph[a][k] + graph[k][b]);
                }
            }
        }

        // ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INFINITY)์ด๋ผ๊ณ  ์ถœ๋ ฅ
                if (graph[a][b] == INF) {
                    System.out.print("INFINITY ");
                }
                // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
                else {
                    System.out.print(graph[a][b] + " ");
                }
            }
            System.out.println();
        }
    }
}

์„ฑ๋Šฅ ๋ถ„์„

  • ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ N๊ฐœ์ผ ๋•Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ƒ์œผ๋กœ N๋ฒˆ์˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค O(N^2)์˜ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๊ฐ€๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^3)์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 500๊ฐœ์ดํ•˜ ์ •๋„๋กœ ์ž‘์€ ๊ฒฝ์šฐ์—๋งŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.





โœ”๏ธ [์‹ค์Šต] ์ „๋ณด

  • ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š” ๊ทธ๋ž˜ํ”„
  • ํ•ต์‹ฌ ์•„์ด๋””์–ด: ํ•œ ๋„์‹œ์—์„œ ๋‹ค๋ฅธ ๋„์‹œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ๋กœ ์น˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • N๊ณผ M์˜ ๋ฒ”์œ„๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ํ™œ์šฉํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ๋‹ค.

python

import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜, ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m, start = map(int, input().split())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n + 1)]
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n + 1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    x, y, z = map(int, input().split())
    # X๋ฒˆ ๋…ธ๋“œ์—์„œ Y๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด Z๋ผ๋Š” ์˜๋ฏธ
    graph[x].append((y, z))

def dijkstra(start):
   q = []
   # ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
   heapq.heappush(q, (0, start))
   distance[start] = 0
   while q: # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        if distance[now] < dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
dijkstra(start)

# ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
count = 0
# ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ์™€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
max_distance = 0
for d in distance:
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
    if d != 1e9:
        count += 1
        max_distance = max(max_distance, d)

# ์‹œ์ž‘ ๋…ธ๋“œ๋Š” ์ œ์™ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ count - 1์„ ์ถœ๋ ฅ
print(count - 1, max_distance)

Java

import java.util.*;

class Node implements Comparable<Node> {

    private int index;
    private int distance;

    public Node(int index, int distance) {
        this.index = index;
        this.distance = distance;
    }

    public int getIndex() {
        return this.index;
    }

    public int getDistance() {
        return this.distance;
    }

    // ๊ฑฐ๋ฆฌ(๋น„์šฉ)๊ฐ€ ์งง์€ ๊ฒƒ์ด ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋„๋ก ์„ค์ •
    @Override
    public int compareTo(Node other) {
        if (this.distance < other.distance) {
            return -1;
        }
        return 1;
    }
}

public class Main {
    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ(Start)
    public static int n, m, start;
    // ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
    public static ArrayList<ArrayList<Node>> graph = new ArrayList<ArrayList<Node>>();
    // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ
    public static int[] d = new int[30001];

    public static void dijkstra(int start) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        // ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ํ์— ์‚ฝ์ž…
        pq.offer(new Node(start, 0));
        d[start] = 0;
        while(!pq.isEmpty()) { // ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
            // ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
            Node node = pq.poll();
            int dist = node.getDistance(); // ํ˜„์žฌ ๋…ธ๋“œ๊นŒ์ง€์˜ ๋น„์šฉ 
            int now = node.getIndex(); // ํ˜„์žฌ ๋…ธ๋“œ
            // ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
            if (d[now] < dist) continue;
            // ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
            for (int i = 0; i < graph.get(now).size(); i++) {
                int cost = d[now] + graph.get(now).get(i).getDistance();
                // ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
                if (cost < d[graph.get(now).get(i).getIndex()]) {
                    d[graph.get(now).get(i).getIndex()] = cost;
                    pq.offer(new Node(graph.get(now).get(i).getIndex(), cost));
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();
        start = sc.nextInt();

        // ๊ทธ๋ž˜ํ”„ ์ดˆ๊ธฐํ™”
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<Node>());
        }
   
        // ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
        for (int i = 0; i < m; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            int z = sc.nextInt();
            // X๋ฒˆ ๋…ธ๋“œ์—์„œ Y๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด Z๋ผ๋Š” ์˜๋ฏธ
            graph.get(x).add(new Node(y, z));
        }

        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        Arrays.fill(d, INF);
      
        // ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
        dijkstra(start);

        // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜
        int count = 0;
        // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ์™€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ
        int maxDistance = 0;
        for (int i = 1; i <= n; i++) {
            // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์ธ ๊ฒฝ์šฐ
            if (d[i] != INF) {
                count += 1;
                maxDistance = Math.max(maxDistance, d[i]);
            }
        }

        // ์‹œ์ž‘ ๋…ธ๋“œ๋Š” ์ œ์™ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ count - 1์„ ์ถœ๋ ฅ
        System.out.println((count - 1) + " " + maxDistance);
    }
}




โœ”๏ธ [์‹ค์Šต] ๋ฏธ๋ž˜ ๋„์‹œ

  • ๋ฐฉํ–ฅ์„ฑ์ด ์žˆ๋Š” ์–‘๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„
  • 1๋งŒํผ์˜ ์‹œ๊ฐ„
  • ํ•ต์‹ฌ ์•„์ด๋””์–ด: ์ „ํ˜•์ ์ธ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์ด๋ฏ€๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•œ๋‹ค.
  • N, M, K์˜ ๋ฒ”์œ„๊ฐ€ ํฌ์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด๋„ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•œ ๋’ค์— (1๋ฒˆ ๋…ธ๋“œ์—์„œ X๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ + X์—์„œ K๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ)๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋ฉด ์ •๋‹ต ํŒ์ •์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

python

INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ๋ฐ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ(๊ทธ๋ž˜ํ”„ ํ‘œํ˜„)๋ฅผ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  ๊ฐ’์„ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
graph = [[INF] * (n + 1) for _ in range(n + 1)]

# ์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for a in range(1, n + 1):
    for b in range(1, n + 1):
        if a == b:
            graph[a][b] = 0

# ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„, ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
for _ in range(m):
    # A์™€ B๊ฐ€ ์„œ๋กœ์—๊ฒŒ ๊ฐ€๋Š” ๋น„์šฉ์€ 1์ด๋ผ๊ณ  ์„ค์ •
    a, b = map(int, input().split())
    graph[a][b] = 1
    graph[b][a] = 1

# ๊ฑฐ์ณ ๊ฐˆ ๋…ธ๋“œ X์™€ ์ตœ์ข… ๋ชฉ์ ์ง€ ๋…ธ๋“œ K๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
x, k = map(int, input().split())

# ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
for k in range(1, n + 1):
    for a in range(1, n + 1):
        for b in range(1, n + 1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

# ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
distance = graph[1][k] + graph[k][x]

# ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, -1์„ ์ถœ๋ ฅ
if distance >= 1e9:
    print("-1")
# ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
else:
    print(distance)

Java

import java.util.*;

public class Main {

    public static final int INF = (int) 1e9; // ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    // ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜(N), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜(M), ๊ฑฐ์ณ ๊ฐˆ ๋…ธ๋“œ(X), ์ตœ์ข… ๋ชฉ์ ์ง€ ๋…ธ๋“œ(K)
    public static int n, m, x, k;
    // 2์ฐจ์› ๋ฐฐ์—ด(๊ทธ๋ž˜ํ”„ ํ‘œํ˜„)๋ฅผ ๋งŒ๋“ค๊ธฐ
    public static int[][] graph = new int[101][101];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt();
        m = sc.nextInt();

        // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < 101; i++) {
            Arrays.fill(graph[i], INF);
        }

        // ์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                if (a == b) graph[a][b] = 0;
            }
        }

        // ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„, ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
        for (int i = 0; i < m; i++) {
            // A์™€ B๊ฐ€ ์„œ๋กœ์—๊ฒŒ ๊ฐ€๋Š” ๋น„์šฉ์€ 1์ด๋ผ๊ณ  ์„ค์ •
            int a = sc.nextInt();
            int b = sc.nextInt();
            graph[a][b] = 1;
            graph[b][a] = 1;
        }

        x = sc.nextInt();
        k = sc.nextInt();

        // ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
        for (int k = 1; k <= n; k++) {
            for (int a = 1; a <= n; a++) {
                for (int b = 1; b <= n; b++) {
                    graph[a][b] = Math.min(graph[a][b], graph[a][k] + graph[k][b]);
                }
            }
        }

        // ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
        int distance = graph[1][k] + graph[k][x];

        // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, -1์„ ์ถœ๋ ฅ
        if (distance >= INF) {
            System.out.println(-1);
        }
        // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        else {
            System.out.println(distance);
        }
    }
}
profile
๋ฐฑ์—”๋“œ ๋ณ‘์•„๋ฆฌ ๐Ÿฅ

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