[백준] 해킹 (10282)(kotlin)
문제 설명
입력 및 출력
» 입력
- 첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스의 개수는 최대 100개이다. 각 테스트 케이스는 다음과 같이 이루어져 있다. 각 테스트 케이스에서 같은 의존성 (a, b)가 두 번 이상 존재하지 않는다.
» 출력
각 테스트 케이스마다 한 줄에 걸쳐 총 감염되는 컴퓨터 수, 마지막 컴퓨터가 감염되기까지 걸리는 시간을 공백으로 구분지어 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
2 3 2 2 2 1 5 3 2 5 3 3 1 2 1 2 3 1 8 3 2 4 |
2 5 3 6 |
문제 풀이1 (Dijkstra - Adjacency List)
import java.util.PriorityQueue
class Node(val destination: Int, val cost: Int): Comparable<Node> {
override fun compareTo(other: Node): Int {
return this.cost - other.cost
}
}
fun main() = with(System.`in`.bufferedReader()) {
repeat(readLine().toInt()) {
val (n, d, c) = readLine().split(" ").map { it.toInt() }
val adjMatrix = Array(n + 1) { PriorityQueue<Node>() }
repeat(d) {
val (a, b, s) = readLine().split(" ").map { it.toInt() }
adjMatrix[b].add(Node(a, s))
}
val result = dijkstra(n, c, adjMatrix)
val count = result.count { it != Int.MAX_VALUE }
val time = result
.map { if (it == Int.MAX_VALUE) 0 else it }
.maxOf { it }
println("$count $time")
}
}
fun dijkstra(n: Int, start: Int, adjMatrix: Array<PriorityQueue<Node>>): IntArray {
val check = BooleanArray(n + 1)
val distance = IntArray(n + 1) { Int.MAX_VALUE }
val q = PriorityQueue<Node>()
q.add(Node(start, 0))
distance[start] = 0
while (q.isNotEmpty()) {
val now = q.poll()
if (check[now.destination]) continue
check[now.destination] = true
for (next in adjMatrix[now.destination]) {
if (distance[next.destination] > distance[now.destination] + next.cost) {
distance[next.destination] = distance[now.destination] + next.cost
q.add(Node(next.destination, distance[next.destination]))
}
}
}
return distance
}