๐ ๋ฌธ์
๐ง ์์ด๋์ด
"๋ง์๋ก๋ถํฐ ๋ฉด์ ์ฅ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ" => ๋ค์ต์คํธ๋ผ.
V: ์ต๋ 10๋ง
E: ์ต๋ 50๋ง
K (๋ฉด์ ์ฅ): ์ต๋ 10๋ง
๋ฐ๋ก ๋ค์ต์คํธ๋ผ๋ฅผ ๋๋ฆฌ๋ฉด ์๋๋ค.
๋ฌด์ํ๊ฒ ๋ชจ๋ ๋ง์๋ก๋ถํฐ ๋ฉด์ ์ฅ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ค ๊ตฌํ๋ คํ๋ฉด
$$ VE Log(E) + VK $$
๋ก ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๋ชจ๋ ๋ฉด์ ์ฅ์์ ๋ง์๊น์ง์ ๊ฑฐ๋ฆฌ๋ก
๊ฐ๊ฐ ๋ค์ต์คํธ๋ผ๋ฅผ ๋๋ ค๋ ์๋๋ค.
๋ฉด์ ์ฅ -> ๋ง์๊น์ง์ ๊ฑฐ๋ฆฌ๋ ๋ฌด์ํ๊ฒ ๋ค๊ตฌํ๋ฉด
$$ KE Log (E) + KV$$
๋ก ๋ง์ฐฌ๊ฐ์ง๋ก ์๊ฐ์ด๊ณผ ๋๋ค.
์๋ ์ด๊ฑฐ ๋์ฒด ์ด์ผํด..?
๋ฐ๋ผ์ ๋ง์ -> ๋ฉด์ ์ฅ์ด ์๋ ๋ฉด์ ์ฅ -> ๋ง์๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ค.
์ด๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ด ์๊ฐ ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ค.
$$ E Log(E) + V $$
์ฌ๊ธฐ์๋ '์์ ์ ์ '์ด
์ฌ๋ฌ๊ฐ์ฌ๋ ๋๋ค.
์ด๋ ๋ฉด์ ์ฅ์ผ๋ก๋ถํฐ ์ด๋ ๋ง์๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ์ธ์ง๊ฐ ์ค์ํ๊ฒ ์๋๊ณ ์ค๋ก์ง ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์ ๋ฐ์ดํธ ๋๊ธฐ๋ง ํ๋ฉด๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋, ๋ค์ต์คํธ๋ผ๋ ํญ์ ํ์ฌ ๋ง๋ค์ด์ง ๊ฐ์ ์ ๋ณด์์ ์ต์ ๊ฐ์ ์ ์ ํ์ ํ๋ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ฏ๋ก ์์์ ์ ์ด ์ฌ๋ฌ๊ฐ๋ก ์งฌ๋ฝ๋ ์ํ๋ก ๋๋ ค๋ ๊ฐ ๋ชฉ์ ๋ง์๊น์ง์ ๋ชจ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ ์ ๋ฐ์ดํธ๋๋ค.
ํ์ด ํ๋ฆ
- ๋ง์ -> ๋ฉด์ ์ฅ์ด ์๋ ๋ฉด์ ์ฅ -> ๋ง์๋ก ๊ฐ์ ์ ๋ณด ์์ ๋ณ๊ฒฝํ์ฌ ์ ์ฅ
- ์์ ์ ์ ์ ๋ชจ๋ ๋ฉด์ ์ฅ์ผ๋ก๋ถํฐ ์ถ๋ฐ
- ์
๋ฐ์ดํธ๋ ๊ฑฐ๋ฆฌ์ ๋ณด์ค ์ต๋ ๊ฑฐ๋ฆฌ๊ฐ๊ณผ index ๋ฅผ ์ถ๋ ฅ
๋จ ์ด๋, ๋๋ก์ ๊ธธ์ด C๊ฐ ์ต๋ 10๋ง์ด๋ฏ๋ก 10๋ง * 50๋ง => 500์ต ์ผ๋ก Int ์ต๋ ๋ฒ์๋ฅผ ๋์ด์ ๋ค
=> ๊ฑฐ๋ฆฌ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฐฐ์ด์ Int ๊ฐ ์๋ Long ์ผ๋ก ์ง์ ํ๋ค.
๐ Kotlin Code
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.PriorityQueue
private fun dijkstra(distances: LongArray, interviewNums: List<Int>, priorityQueue: PriorityQueue<Pair<Int,Long>>, adjacentList: Array<ArrayList<IntArray>>) {
distances[0] = 0
interviewNums.forEach {
distances[it] = 0
// to & weight
priorityQueue.add(Pair(it, distances[it]))
}
while(priorityQueue.isNotEmpty()) {
val (minVertexNum, totalWeight) = priorityQueue.poll()
if (distances[minVertexNum] != totalWeight) continue
// ํ์ฌ ์ต์๋ผ๊ณ ์กํ์ ์ ๋ชจ๋ ๋๋ค์ ๊ธ์ผ๋ฉฐ ๋ค์ ์ต์๋ฅผ ๊ฒฐ์ ํ๋ค.
for (adjacentNode in adjacentList[minVertexNum]) {
val (to, toWeight) = adjacentNode
if (distances[to] <= totalWeight + toWeight.toLong()) continue
distances[to] = totalWeight + toWeight.toLong()
priorityQueue.add(Pair(to, distances[to]))
}
}
}
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val (V, E, I) = br.readLine().split(" ").map(String::toInt)
val distances = LongArray(V + 1){Long.MAX_VALUE}
// index: from, value: (to, weight)
val adjacentList = Array(V + 1){ArrayList<IntArray>()}
val priorityQueue = PriorityQueue<Pair<Int, Long>>(E){ele1, ele2-> ele1.second.compareTo(ele2.second)}
// ๋ชจ๋ ๋ง์์ ์ต์ 1๊ฐ ์ด์์ ๋ฉด์ ์ฅ์ ๋์ฐฉํ ์ ์๋ค.
// => ์ ์๋ ๋ชจ๋ ๋ฉด์ ์ฅ์ ์์์ผ๋ก ๋ชจ๋ ๋ง์์ ๋ํด ์ต์ 1๊ฐ ์ด์ ์ฐ๊ฒฐ๋๋ค.
repeat(E){
val (from, to , weight) = br.readLine().split(" ").map(String::toInt)
// ๋ฉด์ ์ฅ -> ๋ง์๊น์ง์ ๊ฑฐ๋ฆฌ
adjacentList[to].add(intArrayOf(from, weight))
}
val interviewNums = br.readLine().split(" ").map(String::toInt)
dijkstra(distances, interviewNums, priorityQueue, adjacentList)
val maxDistance = distances.maxOf { it }
val maxIdx = distances.indexOf(maxDistance)
println(maxIdx)
println(maxDistance)
}
'Algorithm > Algorithm (๋ฌธ์ ํ์ด)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 7662 ์ด์ค ์ฐ์ ์์ ํ (0) | 2022.11.20 |
---|---|
[๋ฐฑ์ค] 4375 1 (0) | 2022.11.17 |
[๋ฐฑ์ค] 1629 ๊ณฑ์ (0) | 2022.11.12 |
[๋ฐฑ์ค] 2295 ์ธ ์์ ํฉ (1) | 2022.11.05 |
[๋ฐฑ์ค] 18870 ์ขํ ์์ถ (0) | 2022.11.01 |