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