From fad5aeca8b683c15a6d831e56b9dea33b353b67b Mon Sep 17 00:00:00 2001 From: Ben Makusha Date: Mon, 10 Nov 2025 15:27:18 -0500 Subject: [PATCH] chore: [UPDATE] <> Power Grid Maitenance solution --- .../a3607/PowerGridMaintenance.java | 67 +++++++++++++++++++ .../a3607/PowerGridMaintenanceTest.java | 41 ++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/main/java/problemset/a3607/PowerGridMaintenance.java create mode 100644 src/test/java/problemset/a3607/PowerGridMaintenanceTest.java diff --git a/src/main/java/problemset/a3607/PowerGridMaintenance.java b/src/main/java/problemset/a3607/PowerGridMaintenance.java new file mode 100644 index 0000000..139e66e --- /dev/null +++ b/src/main/java/problemset/a3607/PowerGridMaintenance.java @@ -0,0 +1,67 @@ +package problemset.a3607; + +import java.util.*; + +public class PowerGridMaintenance { + Map> adj = new HashMap<>(); + Set online = new HashSet<>(); + Map stationGroup = new HashMap<>(); + Map> minHeap = new HashMap<>(); + + public int[] processQueries(int c, int[][] connections, int[][] queries) { + + for (int[] connection: connections) { + int u = connection[0]; + int v = connection[1]; + + adj.computeIfAbsent(u, k -> new ArrayList<>()).add(v); + adj.computeIfAbsent(v, k -> new ArrayList<>()).add(u); + } + + // build connected components + for (int s = 1; s < c + 1; s++) { + dfs(s, s); + } + + List gather = new ArrayList<>(); + + for (int[] query : queries) { + int type = query[0]; + int station = query[1]; + + if (type == 1) { + if (online.contains(station)) { + gather.add(station); + continue; + } + int groupId = stationGroup.get(station); + PriorityQueue pq = minHeap.get(groupId); + while (pq != null && !pq.isEmpty() && !online.contains(pq.peek())) { + pq.poll(); + } + if (!pq.isEmpty()) { + gather.add(pq.peek()); + } else { + gather.add(-1); + } + } else { + online.remove(station); + } + } + + return gather.stream().mapToInt(Integer::intValue).toArray(); + } + + private void dfs(int station, int groupId) { + if (online.contains(station)) + return; + + online.add(station); + stationGroup.put(station, groupId); + minHeap.computeIfAbsent(groupId, k -> new PriorityQueue<>()).add(station); + + for (int nei : adj.getOrDefault(station, new ArrayList<>())) { + dfs(nei, groupId); + } + } +} diff --git a/src/test/java/problemset/a3607/PowerGridMaintenanceTest.java b/src/test/java/problemset/a3607/PowerGridMaintenanceTest.java new file mode 100644 index 0000000..dc12dfd --- /dev/null +++ b/src/test/java/problemset/a3607/PowerGridMaintenanceTest.java @@ -0,0 +1,41 @@ +package problemset.a3607; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PowerGridMaintenanceTest { + + private PowerGridMaintenance powerGridMaintenance; + private int c1; + private int[][] connections1; + private int[][] queries1; + + + @BeforeEach + void setUp() { + powerGridMaintenance = new PowerGridMaintenance(); + c1 = 5; + connections1 = new int[][]{ + {1, 2}, + {2, 3}, + {3, 4}, + {4, 5} + }; + queries1 = new int[][]{ + {1, 3}, + {2, 1}, + {1, 1}, + {2, 2}, + {1, 2} + }; + } + + @Test + void test_processQueries() { + int[] expected = new int[]{3, 2, 3}; + int[] actual = powerGridMaintenance.processQueries(c1, connections1, queries1); + assertArrayEquals(expected, actual); + } +} \ No newline at end of file