@@ -16,6 +16,44 @@ object Day23 {
1616
1717 def count3CliquesT (edges : Set [Edge ]): Int = find3Cliques(edges).count(_.exists(_.startsWith(" t" )))
1818
19+ // copied from 2018 day 23
20+ // TODO: move to library
21+ def maximumClique (neighbors : Map [Computer , Set [Computer ]]): Set [Computer ] = {
22+ var best : Set [Computer ] = Set .empty
23+
24+ def bronKerbosh (r : Set [Computer ], p : Set [Computer ], x : Set [Computer ]): Unit = {
25+ if (p.isEmpty && x.isEmpty) {
26+ // println(r)
27+ if (r.size > best.size)
28+ best = r
29+ }
30+ else {
31+ // val u = p.headOption.getOrElse(x.head)
32+ val u = (p ++ x).maxBy(neighbors(_).size) // pivot on highest degree
33+ var p2 = p
34+ var x2 = x
35+ for (v <- p -- neighbors(u)) {
36+ bronKerbosh(r + v, p2 intersect neighbors(v), x2 intersect neighbors(v))
37+ p2 -= v
38+ x2 += v
39+ }
40+ }
41+ }
42+
43+ bronKerbosh(Set .empty, neighbors.keySet, Set .empty)
44+ best
45+ }
46+
47+ def maximumClique (edges : Set [Edge ]): Set [Computer ] = {
48+ val neighbors = (edges ++ edges.map(_.swap)).groupMap(_._1)(_._2)
49+ maximumClique(neighbors)
50+ }
51+
52+ def lanPartyPassword (edges : Set [Edge ]): String = {
53+ val clique = maximumClique(edges)
54+ clique.toSeq.sorted.mkString(" ," )
55+ }
56+
1957 def parseEdge (s : String ): Edge = s match {
2058 case s " $from- $to" => (from, to)
2159 }
@@ -26,6 +64,7 @@ object Day23 {
2664
2765 def main (args : Array [String ]): Unit = {
2866 println(count3CliquesT(parseEdges(input)))
67+ println(lanPartyPassword(parseEdges(input)))
2968
3069 // part 1: 2366 - too high (used contains 't' instead of startsWith 't')
3170 }
0 commit comments