mirror of
https://github.com/tiennm99/adventofcode.git
synced 2026-10-12 14:14:43 +00:00
118 lines
1.9 KiB
Go
118 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"sort"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type Edge struct {
|
|
dist int64
|
|
i, j int
|
|
}
|
|
|
|
type DSU struct {
|
|
parent []int
|
|
}
|
|
|
|
func NewDSU(n int) *DSU {
|
|
p := make([]int, n)
|
|
for i := range p {
|
|
p[i] = i
|
|
}
|
|
return &DSU{parent: p}
|
|
}
|
|
|
|
func (d *DSU) Find(x int) int {
|
|
if d.parent[x] != x {
|
|
d.parent[x] = d.Find(d.parent[x])
|
|
}
|
|
return d.parent[x]
|
|
}
|
|
|
|
func (d *DSU) Union(a, b int) {
|
|
ra := d.Find(a)
|
|
rb := d.Find(b)
|
|
if ra != rb {
|
|
d.parent[ra] = rb
|
|
}
|
|
}
|
|
|
|
type Point struct {
|
|
x, y, z int
|
|
}
|
|
|
|
func main() {
|
|
data, _ := os.ReadFile("input.txt")
|
|
lines := strings.Split(strings.TrimSpace(string(data)), "\n")
|
|
|
|
points := []Point{}
|
|
for _, line := range lines {
|
|
fields := strings.Split(line, ",")
|
|
if len(fields) != 3 {
|
|
continue
|
|
}
|
|
x, _ := strconv.Atoi(strings.TrimSpace(fields[0]))
|
|
y, _ := strconv.Atoi(strings.TrimSpace(fields[1]))
|
|
z, _ := strconv.Atoi(strings.TrimSpace(fields[2]))
|
|
points = append(points, Point{x, y, z})
|
|
}
|
|
|
|
n := len(points)
|
|
|
|
edges := make([]Edge, 0, n*(n-1)/2)
|
|
for i := range n {
|
|
p1 := points[i]
|
|
for j := range i {
|
|
p2 := points[j]
|
|
dx := int64(p1.x - p2.x)
|
|
dy := int64(p1.y - p2.y)
|
|
dz := int64(p1.z - p2.z)
|
|
dist := dx*dx + dy*dy + dz*dz
|
|
edges = append(edges, Edge{dist, i, j})
|
|
}
|
|
}
|
|
|
|
sort.Slice(edges, func(a, b int) bool {
|
|
return edges[a].dist < edges[b].dist
|
|
})
|
|
|
|
dsu := NewDSU(n)
|
|
|
|
connections := 0
|
|
|
|
for t, e := range edges {
|
|
if t == 1000 {
|
|
sz := make(map[int]int)
|
|
for x := range n {
|
|
root := dsu.Find(x)
|
|
sz[root]++
|
|
}
|
|
|
|
list := make([]int, 0, len(sz))
|
|
for _, v := range sz {
|
|
list = append(list, v)
|
|
}
|
|
sort.Ints(list)
|
|
|
|
if len(list) >= 3 {
|
|
fmt.Println(list[len(list)-1] * list[len(list)-2] * list[len(list)-3])
|
|
} else {
|
|
fmt.Println(0)
|
|
}
|
|
}
|
|
|
|
ri := dsu.Find(e.i)
|
|
rj := dsu.Find(e.j)
|
|
if ri != rj {
|
|
connections++
|
|
if connections == n-1 {
|
|
fmt.Println(points[e.i].x * points[e.j].x)
|
|
}
|
|
dsu.Union(ri, rj)
|
|
}
|
|
}
|
|
}
|