시작점을 주고 나머지 정점들과 시작점 과의 최단거리 구하기.
처음 시작은 자기자신과의 거리를 0으로 두고
시작점과 나머지 정점들의 거리를 무한으로 초기화 한다.
⇒ dist[] 배열 거리를 나타낸다.
그래프 정점간의 거리
⇒ d[i][j] 정점간 거리를 나타낸다.
0번을 통해 k번 정점으로 가는 거리 dist[0] + d[0][k]이고,
이게 만약 dist[k] 보다 작다면 dist[k]가 갱신된다.
벨만 포드 알고리즘 사용해야 한다.
import Foundation
func solution(_ N:Int, _ roads:[[Int]], _ k:Int) -> Int {
var answer = 0
var graph : [Int: [[Int]]] = [:]
var dist = Array(repeating: Int.max, count: N + 1)
var visited = Array(repeating: false, count: N + 1)
dist[1] = 0
for road in roads {
var temp1 = graph[road[0]] != nil ? graph[road[0]]! : [[Int]]()
temp1.append([road[1], road[2]])
var temp2 = graph[road[1]] != nil ? graph[road[1]]! : [[Int]]()
temp2.append([road[0], road[2]])
graph[road[0]] = temp1
graph[road[1]] = temp2
}
var pq : [Int] = [1]
while !pq.isEmpty {
pq.sort {
dist[$0] <= dist[$1]
}
let top = pq.removeFirst()
visited[top] = true
for next in graph[top]! {
if !visited[next[0]] {
if dist[top] + next[1] < dist[next[0]] {
dist[next[0]] = dist[top] + next[1]
pq.append(next[0])
}
}
}
}
return dist.filter { $0 <= k}.count
}