๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Computer Science/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ๋‹จ ๊ฒฝ๋กœ(Shortest Path)

by hyebin (Helia) 2022. 3. 31.
๋ฐ˜์‘ํ˜•

์ตœ๋‹จ ๊ฒฝ๋กœ(Shortest Path) ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๊ธธ ์ฐพ๊ธฐ ๋ฌธ์ œ๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ
  • ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œํ˜„
    • ๊ฐ ์ง€์ ์€ ๋…ธ๋“œ๋กœ ํ‘œํ˜„
    • ์ง€์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋„๋กœ๋Š” ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„
  • ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ์˜ ์ข…๋ฅ˜
    • ๋‹จ์ผ ์ถœ๋ฐœ(single-source) ์ตœ๋‹จ ๊ฒฝ๋กœ
      • ์–ด๋–ค ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ
    • ๋‹จ์ผ ๋„์ฐฉ(single-destination) ์ตœ๋‹จ ๊ฒฝ๋กœ
      • ๋ชจ๋“  ์ •์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์–ด๋–ค ํ•˜๋‚˜์˜ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ
      • ๊ทธ๋ž˜ํ”„ ๋‚ด์˜ ๊ฐ„์„ ์„ ๋’ค์ง‘์œผ๋ฉด ๋‹จ์ผ ์ถœ๋ฐœ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ
    • ๋‹จ์ผ ์Œ(single-pair) ์ตœ๋‹จ ๊ฒฝ๋กœ
      • ๋ชจ๋“  ์ •์  ์Œ๋“ค ์‚ฌ์ด์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ
  • ์ฃผ์š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ๋ฒจ๋งŒ-ํฌ๋“œ(Bellman-Ford-Moore) ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ”Œ๋กœ์ด๋“œ-์›Œ์…œ(Floyd-Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ํ•˜๋‚˜์˜ ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์Œ์˜ ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ ๋™์ž‘
    • ์Œ์˜ ๊ฐ„์„ : 0๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ„์„ 
  • GPS ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋งค๋ฒˆ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜๋จ
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ
    1. ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ •
    2. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
    3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ ์„ ํƒ
    4. ํ•ด๋‹จ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 
    5. 3,4๋ฒˆ ๋ฐ˜๋ณต
  • ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ํ•ญ์ƒ 1์ฐจ์› ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๋ฉฐ ์ด๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค๋Š” ์ ์ด ํŠน์ง•
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
    • ๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
      • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(V^2)  <V: ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜>
      • ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ด๋Š” 1์ฐจ์› ํ…Œ์ด๋ธ” ์„ ์–ธ
      • ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค 1์ฐจ์› ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ™•์ธ(์ˆœ์ฐจ ํƒ์ƒ‰) ํ•œ๋‹ค.
    • ๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
      • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(ElogV) <V: ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, E: ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜>
      • ํž™(Heap) ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ
        • ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue)๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
        • ์šฐ์„ ์ˆœ์œ„ ํ: ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œ
      • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ•  ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ •์˜

 

๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋ชจ๋“  ๊ฐ„์„ ์„ ์ „๋ถ€ ํ™•์ธํ•˜๋ฉด์„œ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•จ
  • ์Œ์˜ ๊ฐ„์„ ์ด ์žˆ์–ด๋„ ์ตœ์ ์˜ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ O(VE) <V: ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜,E: ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜>
  • ์ˆ˜ํ–‰๊ณผ์ •
    1. ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ •
    2. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”
    3. ๋ชจ๋“  ๊ฐ„์„  E ๊ฐœ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธ
    4. ๊ฐ ๊ฐ„์„ ์„ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 
    5. 3,4๋ฒˆ ๊ณผ์ •์„ V-1 ๋ฐ˜๋ณต

 

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

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

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

๋ฏธ๋ž˜ ๋„์‹œ

๋ฐฉ๋ฌธ ํŒ๋งค์› A๋Š” ๋งŽ์€ ํšŒ์‚ฌ๊ฐ€ ๋ชจ์—ฌ ์žˆ๋Š” ๊ณต์ค‘ ๋ฏธ๋ž˜ ๋„์‹œ์— ์žˆ๋‹ค.
๊ณต์ค‘ ๋ฏธ๋ž˜ ๋„์‹œ์—๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ ๊นŒ์ง€์˜ ํšŒ์‚ฌ๊ฐ€ ์žˆ๋Š”๋ฐ ํŠน์ • ํšŒ์‚ฌ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ๋„๋กœ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.
๋ฐฉ๋ฌธ ํŒ๋งค์› A๋Š” ํ˜„์žฌ 1๋ฒˆ ํšŒ์‚ฌ์— ์œ„์น˜ํ•ด ์žˆ์œผ๋ฉฐ X๋ฒˆ ํšŒ์‚ฌ์— ๋ฐฉ๋ฌธํ•ด ๋ฌผ๊ฑด์„ ํŒ๋งคํ•˜๊ณ ์ž ํ•œ๋‹ค.

ํŠน์ • ํšŒ์‚ฌ์— ๋„์ฐฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ํšŒ์‚ฌ๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋„๋กœ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์œ ์ผํ•˜๋‹ค.
๋˜ํ•œ ์—ฐ๊ฒฐ๋œ 2๊ฐœ์˜ ํšŒ์‚ฌ๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ํšŒ์‚ฌ์™€ ๋‹ค๋ฅธ ํšŒ์‚ฌ๊ฐ€ ๋„๋กœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์ •ํ™•ํžˆ 1๋งŒํผ์˜ ์‹œ๊ฐ„์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ ์˜ค๋Š˜ A๋Š” ์†Œ๊ฐœํŒ…์—๋„ ์ฐธ์„ํ•˜๊ณ ์ž ํ•œ๋‹ค.
์†Œ๊ฐœํŒ… ์ƒ๋Œ€๋Š” K๋ฒˆ ํšŒ์‚ฌ์— ์กด์žฌํ•˜๋ฉฐ, A๋Š” X๋ฒˆ ํšŒ์‚ฌ์— ๊ฐ€๊ธฐ ์ „ ์†Œ๊ฐœํŒ… ์ƒ๋Œ€๋ฅผ ๋งŒ๋‚˜๊ณ ์ž ํ•œ๋‹ค.
A๊ฐ€ ํšŒ์‚ฌ ์‚ฌ์ด๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋˜๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

1๋ฒˆ ๋…ธ๋“œ์—์„œ K๋ฅผ ๊ฑฐ์ณ X๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” (1๋ฒˆ ๋…ธ๋“œ์—์„œ K๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ + K์—์„œ X๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ) ์ด๋‹ค.

var input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input_data[0], m = input_data[1]

var graph: [[Int]] = Array(repeating: Array(repeating: Int.max, count: n+1), count: n+1)

for i in 1..<n+1{
    for j in 1..<n+1{
        if i == j {
            graph[i][j] = 0
        }
    }
}

//์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for _ in 0..<m{
    var ab = readLine()!.split(separator: " ").map{Int(String($0))!}
    graph[ab[0]][ab[1]] = 1
    graph[ab[1]][ab[0]] = 1
}

var xk = readLine()!.split(separator: " ").map{Int(String($0))!}
var x = xk[0], k = xk[1]

//ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
for i in 1..<n+1{
    for a in 1..<n+1{
        for b in 1..<n+1{
            if graph[a][i] < Int.max && graph[i][b] < Int.max{
                graph[a][b] = min(graph[a][b], graph[a][i] + graph[i][b])
            }
        }
    }
}

if graph[1][k] < Int.max && graph[k][x] < Int.max{
    var distance = graph[1][k] + graph[k][x]
    print(distance)
}else{
    print("-1")
}

์ „๋ณด

์–ด๋–ค ๋‚˜๋ผ์—๋Š” N๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ ๋„์‹œ๋Š” ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋‹ค๋ฅผ ๋„์‹œ๋กœ ์ „๋ณด๋ฅผ ๋ณด๋‚ด์„œ ๋‹ค๋ฅธ ๋„์‹œ์— ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ X ๋„์‹œ์—์„œ Y๋„์‹œ๋กœ ์ „๋ณด๋ฅผ ๋ณด๋‚ด๊ณ ์ž ํ•œ๋‹ค๋ฉด, X์—์„œ Y๋กœ ํ–ฅํ•˜๋Š” ํ†ต๋กœ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
ํ†ต๋กœ๋ฅผ ๊ฑฐ์ณ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” ์ผ์ • ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

์–ด๋А๋‚  C ๋„์‹œ์—์„œ ์œ„๊ธ‰ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ๋„์‹œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ ์ž ํ•œ๋‹ค.
๋ฉ”์‹œ์ง€๋Š” C์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๊ฐ ๋„์‹œ ์‚ฌ์ด์—  ์„ค์น˜๋œ ํ†ต๋กœ๋ฅผ ๊ฑฐ์ณ, ์ตœ๋Œ€ํ•œ ๋งŽ์ด ํผ์ ธ๋‚˜๊ฐˆ๊ฒƒ์ด๋‹ค.

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

์›๋ž˜ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ swift์—์„œ๋Š” ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์•„ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

var input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input_data[0], m = input_data[1], start = input_data[2]

var graph: [[[Int]]] = Array(repeating: Array(repeating: Array(repeating: 0, count: 0), count: 0), count: n+1)
var distance: [Int] = Array(repeating: Int.max, count: n+1)

for _ in 0..<m{
    input_data = readLine()!.split(separator: " ").map{Int(String($0))!}
    var x = input_data[0], y = input_data[1], z = input_data[2]
    graph[x].append([y,z])
}

func dijkstra(_ start: Int){
    var queue: [[Int]] = [[start, 0]]
    distance[start] = 0
    
    while !queue.isEmpty{
        let first = queue.removeFirst()
        
        if distance[first[0]] < first[1]{
            continue
        }
        
        for i in graph[first[0]]{
            var cost = first[1] + i[1]
            if cost < distance[i[0]]{
                distance[i[0]] = cost
                queue.append([i[0],cost])
            }
        }
        
    }
}

dijkstra(start)

var count = 0, max_distance = 0

for d in distance {
    if d != Int.max{
        count += 1
        max_distance = max(max_distance, d)
    }
}

print(count-1, max_distance)
๋ฐ˜์‘ํ˜•