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 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<IntArray>): Iterable<Pair<Pair<Int, Int>, Float>> {
val distances = ArrayList<Pair<Pair<Int, Int>, Float>>()
// having an oct-tree might speed up things here, so we skip far distances
fun createDistances(nodes: Array<IntArray>): PriorityQueue<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 (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) {