--- Difficulty: Medium Source: 160 Days of Problem Solving Tags: - Graph --- # 🚀 _Day 10. Minimum cost to connect all houses in a city_ 🧠 The problem can be found at the following link: [Question Link](https://www.geeksforgeeks.org/batch/gfg-160-problems/track/graph-gfg-160/problem/minimum-cost-to-connect-all-houses-in-a-city) ## 💡 **Problem Description:** Given a **2D array `houses[][]`** of size `n`, where each subarray contains the `(x, y)` coordinates of a house, the goal is to **connect all houses** such that: - Each house is connected to at least one other house. - The **total cost of connecting all houses is minimized**. The **cost** to connect two houses is the **Manhattan Distance**: $\[ \text{Cost} = |x_1 - x_2| + |y_1 - y_2| $\] > **Note:** Sorry for uploading late, my Final Sem exam is going on. ## 🔍 **Example Walkthrough:** ### **Example 1:** #### **Input:** ``` n = 5 houses[][] = [[0, 7], [0, 9], [20, 7], [30, 7], [40, 70]] ``` #### **Output:** ``` 105 ``` #### **Explanation:** - Connect house 1 (0,7) and house 2 (0,9) with cost = 2 - Connect house 1 (0,7) and house 3 (20,7) with cost = 20 - Connect house 3 (20,7) and house 4 (30,7) with cost = 10 - Connect house 4 (30,7) and house 5 (40,70) with cost = 73 Overall minimum cost: 2 + 10 + 20 + 73 = 105. ### **Example 2:** #### **Input:** ``` n = 4 houses[][] = [[0, 0], [1, 1], [1, 3], [3, 0]] ``` #### **Output:** ``` 7 ``` #### **Explanation:** - Connect house 1 (0,0) and house 2 (1,1) with cost = 2 - Connect house 2 (1,1) and house 3 (1,3) with cost = 2 - Connect house 1 (0,0) and house 4 (3,0) with cost = 3 Overall minimum cost: 2 + 2 + 3 = 7. ### **Constraints:** - $1 ≤ n ≤ 10^3$ - $0 ≤ houses[i][j] ≤ 10^3$ ## 🎯 **My Approach:** ### **Optimized Prim’s Algorithm** 1. **Overview:** We use **Prim's algorithm** to compute the Minimum Spanning Tree (MST) of a complete graph where each node represents a house and the weight between two houses is their Manhattan distance. 2. **Algorithm Steps:** - **Initialize:** - Create an array `d` to store the minimum cost (distance) to connect each house; initialize with a large value (infinity), except for the first house set to 0. - Maintain an array `vis` to mark visited houses. - **Construct the MST:** - Repeat for all houses: - Select the house `u` not yet visited with the smallest cost `d[u]`. - Mark the house `u` as visited and add `d[u]` to the total cost. - Update the cost of reaching every other house `v` (not yet visited) as the minimum of its current cost and the Manhattan distance from house `u` to house `v`. - **Return the Total Cost:** - After processing all houses, the total cost accumulated gives the minimum cost to connect all houses. ## 🕒 **Time and Auxiliary Space Complexity** - **Expected Time Complexity:** O(n²), as for each of the n houses, we update distances for up to n houses. - **Expected Auxiliary Space Complexity:** O(n), as we maintain two arrays (`d` and `vis`) of size n. ## 📝 **Solution Code** ## **Code (C++)** ```cpp class Solution { public: int minCost(vector>& a) { int n = a.size(), ans = 0, u = 0; vector vis(n); vector d(n, 1e9); d[0] = 0; for (int i = 0; i < n; ++i) { int m = 1e9, idx = -1; for (int j = 0; j < n; ++j) if (!vis[j] && d[j] < m) m = d[j], idx = j; vis[idx] = 1; ans += m; for (int j = 0; j < n; ++j) if (!vis[j]) d[j] = min(d[j], abs(a[idx][0] - a[j][0]) + abs(a[idx][1] - a[j][1])); } return ans; } }; ``` ## **Code (Java)** ```java class Solution { public int minCost(int[][] a) { int n = a.length, ans = 0; boolean[] vis = new boolean[n]; int[] d = new int[n]; Arrays.fill(d, Integer.MAX_VALUE); d[0] = 0; for (int i = 0; i < n; i++) { int m = Integer.MAX_VALUE, u = -1; for (int j = 0; j < n; j++) if (!vis[j] && d[j] < m) { m = d[j]; u = j; } vis[u] = true; ans += m; for (int j = 0; j < n; j++) if (!vis[j]) d[j] = Math.min(d[j], Math.abs(a[u][0] - a[j][0]) + Math.abs(a[u][1] - a[j][1])); } return ans; } } ``` ## **Code (Python)** ```python class Solution: def minCost(self, a): n, ans = len(a), 0 vis = [0]*n d = [float('inf')]*n d[0] = 0 for _ in range(n): m, u = float('inf'), -1 for i in range(n): if not vis[i] and d[i] < m: m, u = d[i], i vis[u] = 1 ans += m for v in range(n): if not vis[v]: d[v] = min(d[v], abs(a[u][0] - a[v][0]) + abs(a[u][1] - a[v][1])) return ans ``` ## 🎯 **Contribution and Support:** For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: [Any Questions](https://www.linkedin.com/in/patel-hetkumar-sandipbhai-8b110525a/). Let’s make this learning journey more collaborative! ⭐ **If you find this helpful, please give this repository a star!** ⭐ ---

📍Visitor Count