From 52af74ecd5cf193cb84ec5e3a43ddfd773335a8e Mon Sep 17 00:00:00 2001 From: chrisly42 Date: Mon, 8 Dec 2025 07:04:34 +0100 Subject: [PATCH] Day 8: Use priority queue. --- src/aoc2025/Day08.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/aoc2025/Day08.kt b/src/aoc2025/Day08.kt index 736c671..1a62579 100644 --- a/src/aoc2025/Day08.kt +++ b/src/aoc2025/Day08.kt @@ -3,6 +3,7 @@ package aoc2025 import println import readInput import splitInts +import java.util.* import kotlin.math.sqrt /* @@ -54,16 +55,15 @@ fun main() { return false } - // priority queue would have been more efficient... who cares - fun createDistances(nodes: Array): Iterable, Float>> { - val distances = ArrayList, Float>>() + // having an oct-tree might speed up things here, so we skip far distances + fun createDistances(nodes: Array): PriorityQueue, Float>> { + val distances = PriorityQueue, Float>>(nodes.size * nodes.size / 2, Comparator.comparing { it.second }) for (i1 in 0 until nodes.size) { for (i2 in i1 + 1 until nodes.size) { val d = dist(nodes[i1], nodes[i2]) distances.add((i1 to i2) to d) } } - distances.sortBy { it.second } return distances } @@ -74,8 +74,8 @@ fun main() { val n = nodes.size var numCircuits = 0 val unionFindParentArray = IntArray(n) { it } - for (d in distances) { - val (n1, n2) = d.first + while (distances.isNotEmpty()) { + val (n1, n2) = distances.remove().first union(unionFindParentArray, n1, n2) numCircuits++ if (numCircuits == numConnections) break @@ -95,8 +95,8 @@ fun main() { val n = nodes.size var numCircuits = 1 val unionFindParentArray = IntArray(n) { it } - for (d in distances) { - val (n1, n2) = d.first + while (distances.isNotEmpty()) { + val (n1, n2) = distances.remove().first if (union(unionFindParentArray, n1, n2)) { numCircuits++ if (numCircuits == n) {