๐ ๋ฌธ์
๐ง ์์ด๋์ด
๋ฐ๋์ 2๊ฐ์ ์ ์ ์ ๊ฒฝ์ ํด์ ๊ฐ์ผํ๋ฏ๋ก
Way point (๊ฒฝ์ ์ง) 1, 2 ๊ฐ ์กด์ฌํ ๋ ์ ํํ ์ ์๋ ๊ฒฝ๋ก๋ ๋ค์ 2๊ฐ์ง๋ก ์ขํ์ง๋ค.
์ถ๋ฐ ๋ ธ๋ -> ๊ฒฝ์ ์ง 1 -> ๊ฒฝ์ ์ง 2 -> ๋ชฉ์ ์ง
์ถ๋ฐ ๋ ธ๋ -> ๊ฒฝ์ ์ง 2 -> ๊ฒฝ์ ์ง 1 -> ๋ชฉ์ ์ง
์ฌ๊ธฐ์ ๊ตฌํด์ผ ํ ๊ฐ์ ๋ค์ 5๊ฐ์ง๋ค.
- ์ถ๋ฐ ๋ ธ๋ -> ๊ฒฝ์ ์ง 1์ ์ต๋จ๊ฒฝ๋ก
- ์ถ๋ฐ ๋ ธ๋ -> ๊ฒฝ์ ์ง 2์ ์ต๋จ๊ฒฝ๋ก
- ๊ฒฝ์ ์ง 1 -> ๋ชฉ์ ์ง์ ์ต๋จ๊ฒฝ๋ก
- ๊ฒฝ์ ์ง 2 -> ๋ชฉ์ ์ง์ ์ต๋จ๊ฒฝ๋ก
- ๊ฒฝ์ ์ง 1 - ๊ฒฝ์ ์ง2 ์ ์ต๋จ๊ฒฝ๋ก
์๋ฐฉํฅ ๊ทธ๋ํ๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ ์ง 1-> ๊ฒฝ์ ์ง 2, ๊ฒฝ์ ์ง 2-> ๊ฒฝ์ ์ง1๋ ์๋ก ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ ํ ๋ฒ๋ง ๊ตฌํ๋ฉด ๋๋ค.
์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผํ๋ฏ๋ก Dijkstra ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉํ๋ค.
์ถ๋ฐ ๋ ธ๋ -> ๊ฒฝ์ ์ง 1,2 ๋ ํ๋ฒ์ ๊ตฌํ ์ ์๊ณ
๊ฒฝ์ ์ง 1-> ๋ชฉ์ ์ง, ๊ฒฝ์ ์ง 2-> ๋ชฉ์ ์ง, ๊ฒฝ์ ์ง 1-> ๊ฒฝ์ ์ง2
์ฆ ์ด 4๋ฒ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ ค์ ์๋ 2๊ฐ์ง ๊ฒฝ๋ก ์ค ๋ ์ ์ ๊ฒฝ๋ก๊ฐ์ ๋ฐํํ๋ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
์ถ๋ฐ ๋ ธ๋ -> ๊ฒฝ์ ์ง 1 -> ๊ฒฝ์ ์ง 2 -> ๋ชฉ์ ์ง
์ถ๋ฐ ๋ ธ๋ -> ๊ฒฝ์ ์ง 2 -> ๊ฒฝ์ ์ง 1 -> ๋ชฉ์ ์ง
์ค์ํ๊ธฐ ์ฌ์ด ํฌ์ธํธ
โ ๏ธ ๋ค์ต์คํธ๋ผ ๋ฐ๋ณต ์ค๊ฐ ์ค๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ ์ด๊ธฐํ ์ค์ผํ๋ค.
โ ๏ธ ๊ฒฝ๋ก ์ค๊ฐ์ Int.MAX_VALUE (๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ) -1 ์ ์ถ๋ ฅํด์ผํ๋ค.
๐ Kotlin Code
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import kotlin.math.min
// minimum weight has max priority
val priorityQueue = PriorityQueue<IntArray>() {arr1, arr2-> arr1[1].compareTo(arr2[1])}
private fun dijkstra(startNode: Int, adjacentList: Array<LinkedList<IntArray>>, distances: Array<Int>) {
distances[startNode] = 0
priorityQueue.add(intArrayOf(startNode, distances[startNode]))
while (priorityQueue.isNotEmpty()) {
val (curNode, totalWeight) = priorityQueue.poll()
if (distances[curNode] != totalWeight) continue
// ์ธ์ ํ ๋
ธ๋๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ๋ฉฐ
// ๋ค์ ๊ฒฝ๋ก๊ฐ ํ์ฌ ์ ํด์ง ๊ฒฝ๋ก๋ณด๋ค ์งง์์ง ํ์ธ
for (nextNode in adjacentList[curNode]) {
val (to, weight) = nextNode
if (distances[to] <= totalWeight + weight) continue
distances[to] = totalWeight + weight
priorityQueue.add(intArrayOf(to, distances[to]))
}
}
}
fun main(){
// way point 1, 2 ๊ฐ ์์ ๋
// ๋ชฉ์ ์ง๋ ๋ค์ 2์ผ์ด์ค
// way point 1 ๊น์ง์ ๊ฑฐ๋ฆฌ + 1-2 ์ฌ์ด์ ๊ฑฐ๋ฆฌ + way point 2 ๋ถํฐ ๋ชฉ์ ์ง ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ
// way point 2 ๊น์ง์ ๊ฑฐ๋ฆฌ + 1-2 ์ฌ์ด์ ๊ฑฐ๋ฆฌ + way point 1๋ถํฐ ๋ชฉ์ ์ง ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ
val bufferedReader = BufferedReader(InputStreamReader(System.`in`))
val (V, E) = bufferedReader.readLine().split(" ").map(String::toInt)
// index: from, value: [to, weight]
val adjacentList = Array(V + 1){ LinkedList<IntArray>() }
val distances = Array(V + 1){Int.MAX_VALUE}
repeat(E){_->
val (from, to, weight) = bufferedReader.readLine().split(" ").map(String::toInt)
// undirected graph
adjacentList[from].add(intArrayOf(to, weight))
adjacentList[to].add(intArrayOf(from, weight))
}
val (wayPoint1, wayPoint2) = bufferedReader.readLine().split(" ").map(String::toInt)
dijkstra(1, adjacentList, distances)
// 1 ๋ฒ ์ ์ ์ผ๋ก๋ถํฐ ๊ฒฝ์ ์ง 1, 2 ๊น์ง์ ๊ฑฐ๋ฆฌ
val toWayPoint1 = distances[wayPoint1]
val toWayPoint2 = distances[wayPoint2]
Arrays.fill(distances, Int.MAX_VALUE)
dijkstra(wayPoint1, adjacentList, distances)
// waypoint 1 - 2 ์ฌ์ด ๊ฑฐ๋ฆฌ
val distanceBetweenWayPoint = distances[wayPoint2]
// waypoint 1 -> ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ
val wayPoint1ToDestination = distances[V]
Arrays.fill(distances, Int.MAX_VALUE)
dijkstra(wayPoint2, adjacentList, distances)
// waypoint 2 -> ๋ชฉ์ ์ง ๊ฑฐ๋ฆฌ
val wayPoint2ToDestination = distances[V]
// ์ค๊ฐ์ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ฉด
if (toWayPoint1 == Int.MAX_VALUE || toWayPoint2 == Int.MAX_VALUE ||
distanceBetweenWayPoint == Int.MAX_VALUE ||
wayPoint1ToDestination == Int.MAX_VALUE || wayPoint2ToDestination == Int.MAX_VALUE
) {
print(-1)
return
}
// ์ถ๋ฐ ๋
ธ๋ -> ๊ฒฝ์ ์ง 1 -> ๊ฒฝ์ ์ง 2 -> ๋ชฉ์ ์ง
val way1 = toWayPoint1 + distanceBetweenWayPoint + wayPoint2ToDestination
// ์ถ๋ฐ ๋
ธ๋ -> ๊ฒฝ์ ์ง 2 -> ๊ฒฝ์ ์ง 1 -> ๋ชฉ์ ์ง
val way2 = toWayPoint2 + distanceBetweenWayPoint + wayPoint1ToDestination
print(min(way1, way2))
}
'Algorithm > Algorithm (๋ฌธ์ ํ์ด)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 10799 ์ ๋ง๋๊ธฐ (0) | 2022.10.11 |
---|---|
[๋ฐฑ์ค] 15686 ์นํจ ๋ฐฐ๋ฌ (1) | 2022.10.10 |
[๋ฐฑ์ค] 18808 ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2022.10.06 |
[๋ฐฑ์ค] 15683 ๊ฐ์ (0) | 2022.10.03 |
[๋ฐฑ์ค] 2493 ํ (0) | 2022.10.03 |