Day 8: Use priority queue.

This commit is contained in:
Chris Hodges 2025-12-08 07:04:34 +01:00
parent 7a58627132
commit 52af74ecd5

View File

@ -3,6 +3,7 @@ package aoc2025
import println import println
import readInput import readInput
import splitInts import splitInts
import java.util.*
import kotlin.math.sqrt import kotlin.math.sqrt
/* /*
@ -54,16 +55,15 @@ fun main() {
return false return false
} }
// priority queue would have been more efficient... who cares // having an oct-tree might speed up things here, so we skip far distances
fun createDistances(nodes: Array<IntArray>): Iterable<Pair<Pair<Int, Int>, Float>> { fun createDistances(nodes: Array<IntArray>): PriorityQueue<Pair<Pair<Int, Int>, Float>> {
val distances = ArrayList<Pair<Pair<Int, Int>, Float>>() val distances = PriorityQueue<Pair<Pair<Int, Int>, Float>>(nodes.size * nodes.size / 2, Comparator.comparing { it.second })
for (i1 in 0 until nodes.size) { for (i1 in 0 until nodes.size) {
for (i2 in i1 + 1 until nodes.size) { for (i2 in i1 + 1 until nodes.size) {
val d = dist(nodes[i1], nodes[i2]) val d = dist(nodes[i1], nodes[i2])
distances.add((i1 to i2) to d) distances.add((i1 to i2) to d)
} }
} }
distances.sortBy { it.second }
return distances return distances
} }
@ -74,8 +74,8 @@ fun main() {
val n = nodes.size val n = nodes.size
var numCircuits = 0 var numCircuits = 0
val unionFindParentArray = IntArray(n) { it } val unionFindParentArray = IntArray(n) { it }
for (d in distances) { while (distances.isNotEmpty()) {
val (n1, n2) = d.first val (n1, n2) = distances.remove().first
union(unionFindParentArray, n1, n2) union(unionFindParentArray, n1, n2)
numCircuits++ numCircuits++
if (numCircuits == numConnections) break if (numCircuits == numConnections) break
@ -95,8 +95,8 @@ fun main() {
val n = nodes.size val n = nodes.size
var numCircuits = 1 var numCircuits = 1
val unionFindParentArray = IntArray(n) { it } val unionFindParentArray = IntArray(n) { it }
for (d in distances) { while (distances.isNotEmpty()) {
val (n1, n2) = d.first val (n1, n2) = distances.remove().first
if (union(unionFindParentArray, n1, n2)) { if (union(unionFindParentArray, n1, n2)) {
numCircuits++ numCircuits++
if (numCircuits == n) { if (numCircuits == n) {