특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 알려주는 탐색 알고리즘이며 gps에 이용된다.
https://school.programmers.co.kr/learn/courses/30/lessons/12978
fun dfs(node: Node, visited: Array<Boolean>, sum: Int) {
if(visited[node.num]) {
return
}
if(minTime[node.num] > sum) {
minTime[node.num] = sum
}
visited[node.num] = true
node.next.forEach {
dfs(nodes[it.first], visited, sum+it.second)
}
visited[node.num] = false
}
모든 경로를 확인하다 보니 시간초과가 떴다..
class Node(var num: Int) {
val next = mutableSetOf<Pair<Int, Int>>() //Pair(nextNum, time)
}
2) 주어진 정보 가공
val nodes = Array<Node>(N+1) { Node(-1) }
(1..N).forEach {
nodes[it].num = it
}
val minTime = Array<Int>(N+1) { Int.MAX_VALUE }
val done = Array<Boolean>(N+1) { false }
road.forEach {
val num1 = it[0]
val num2 = it[1]
val time = it[2]
nodes[num1].next.add(Pair(num2, time))
nodes[num2].next.add(Pair(num1, time))
}
3) dfs 함수 정의
fun dfs(node: Node, from: Int, fromEx: Int) {
if(minTime[node.num] < fromEx) {
return
}
minTime[node.num] = fromEx
for(ele in node.next) {
if(ele.first == from) continue
dfs(nodes[ele.first], node.num, fromEx + ele.second)
}
}
4) 이용
dfs(nodes[1], -1, 0)
minTime.forEachIndexed { i, it ->
println("$i: $it")
if(it <= k) answer++
}
return answer