Optimize Water Distribution in a Village
There are N homes in a village, we have to facilitate water supply in each of them. We can either build a well in a home or connect it with pipe to some different home already having water supply. More formally, we can either build a new well in the home or connect it with a pipeline to some different home which either has it’s own well or further gets water supply from a different home and so on. There is some cost associated with both building a new well and laying down a new pipeline. We have to supply water in all homes and minimise the total cost.
Input- First line contains an integer N, the number of homes. The next line contains N integers, the ith integer denotes the cost of building a well in that home. Next line contains an integer K, then K lines follows. Each of which contains 3 integers i, j and p. Which denotes the cost ‘p’ of laying down pipeline between homes i and j.
Output- Output a single integer - the minimum cost to supply water to all the homes
class solution {
public static int findParent(int[] parent, int n) {
while (parent[n] != n)
n = parent[n];
return n;
}
public static int findMinCost(int n, int[][] edges, int[] wells) {
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[2] - b[2]);
for (int[] edge : edges)
pq.add(edge);
// Dummy edges from wells
for (int i = 0; i < n; i++)
pq.add(new int[] { n, i, wells[i] });
// Parent Array
int[] parent = new int[n + 1];
for (int i = 0; i <= n; i++)
parent[i] = i;
int minCost = 0;
// This will make exactly n edges
// Because we added 1 dummy node
// therefore total nodes -> n+1
// number of edges such that all receive water -> n
while (pq.size() > 0) {
int[] edge = pq.poll();
int parentX = findParent(parent, edge[0]);
parent[edge[0]] = parentX;
int parentY = findParent(parent, edge[1]);
parent[edge[1]] = parentY;
if (parentX != parentY) {
parent[parentX] = parentY;
minCost += edge[2];
}
}
return minCost;
}
}
Last updated