Day 8: Use priority queue.
This commit is contained in:
parent
7a58627132
commit
52af74ecd5
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user