Virtual node + Kruskal
Time O((n + p) log(n + p)) Space O(n + p)Edges = pipes plus (0, i, wells[i − 1]). Kruskal over n + 1 nodes.
import java.util.*;
class Solution {
private int[] parent;
public int minCostToSupplyWater(int n, int[] wells, int[][] pipes) {
List<int[]> edges = new ArrayList<>();
for (int i = 1; i <= n; i++) edges.add(new int[]{0, i, wells[i - 1]});
for (int[] p : pipes) edges.add(p);
edges.sort(Comparator.comparingInt(e -> e[2]));
parent = new int[n + 1];
for (int i = 0; i <= n; i++) parent[i] = i;
int total = 0;
for (int[] e : edges) {
int a = find(e[0]), b = find(e[1]);
if (a == b) continue;
parent[a] = b;
total += e[2];
}
return total;
}
private int find(int x) {
while (parent[x] != x) { parent[x] = parent[parent[x]]; x = parent[x]; }
return x;
}
}Verdict: The virtual node is the whole trick.