반응형
문제 출처 : https://www.acmicpc.net/problem/14284
문제
정점 n개, 0개의 간선으로 이루어진 무방향 그래프가 주어진다. 그리고 m개의 가중치 간선의 정보가 있는 간선리스트가 주어진다. 간선리스트에 있는 간선 하나씩 그래프에 추가해 나갈 것이다. 이때, 특정 정점 s와 t가 연결이 되는 시점에서 간선 추가를 멈출 것이다. 연결이란 두 정점이 간선을 통해 방문 가능한 것을 말한다.
s와 t가 연결이 되는 시점의 간선의 가중치의 합이 최소가 되게 추가하는 간선의 순서를 조정할 때, 그 최솟값을 구하시오.
입력
첫째 줄에 정점의 개수 n, 간선리스트의 간선 수 m이 주어진다.(2≤n≤5000,1≤m≤100,000)
다음 m줄에는 a,b,c가 주어지는데, 이는 a와 b는 c의 가중치를 가짐을 말한다. (1≤a,b≤n,1≤c≤100,a≠b)
다음 줄에는 두 정점 s,t가 주어진다. (1≤s,t≤n,s≠t)
모든 간선을 연결하면 그래프는 연결 그래프가 됨이 보장된다.
출력
s와 t가 연결되는 시점의 간선의 가중치 합의 최솟값을 출력하시오,
알고리즘 분류
풀이
다익스트라 문제이다.
s와 t가 연결이 되는 시점의 간선의 가중치의 합이 최소가 되게 추가하는 간선의 순서를 조정할 때, 그 최솟값을 구하시오.
이 말은 s 와 t를 연결한 간선들의 가중치 합이 최소가 되게끔 하라는 말.
따라서 다익스트라로 최소 간선들로 dp배열을 갱신해주면 된다.
다익스트라 기본 문제라 딱히 설명할 것은 없고 다익스트라 알고리즘에 대해 안다면 쉽게 풀 수 있다.
다익스트라로 dp 배열을 만들면 dp[t]가 정답이 된다.
코드
import java.util.*
val br = System.`in`.bufferedReader()
fun getIntList() = br.readLine().split(' ').map { it.toInt() }
fun getInt() = br.readLine().toInt()
var n = 0
var m = 0
var s = 0
var t = 0
lateinit var edge: Array<ArrayList<Pair<Int, Int>>>
lateinit var dp: IntArray
fun dijkstra(): Int {
val pq = PriorityQueue<Pair<Int, Int>> { a, b -> a.second - b.second }
pq.add(Pair(s, 0))
dp[s] = 0
while (pq.isNotEmpty()) {
val (cur, curDis) = pq.poll()
if (dp[cur] < curDis) continue
for ((next, nextDis) in edge[cur]) {
if (dp[next] <= curDis + nextDis) continue
dp[next] = curDis + nextDis
pq.add(Pair(next, curDis + nextDis))
}
}
return dp[t]
}
fun main() = with(System.out.bufferedWriter()) {
//input
getIntList().also {
n = it[0]
m = it[1]
}
dp = IntArray(n + 1) { Int.MAX_VALUE }
edge = Array(n + 1) { ArrayList() }
repeat(m) {
val (from, to, dis) = getIntList()
edge[from].add(Pair(to, dis))
edge[to].add(Pair(from, dis))
}
getIntList().also {
s = it[0]
t = it[1]
}
//solve, output
write("${dijkstra()}")
close()
}
반응형
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 1527 금민수의 개수 Kotlin (완전 탐색) (0) | 2022.08.23 |
---|---|
백준 20442 ㅋㅋ루ㅋㅋ Kotlin (투 포인터) (0) | 2022.08.20 |
백준 14621 나만 안되는 연애 Kotlin (최소 스패닝 트리) (0) | 2022.08.18 |
백준 4097 수익 Kotlin (dp) (0) | 2022.08.17 |
백준 1940 주몽 Kotlin (투 포인터) (0) | 2022.08.16 |
댓글