Given a 2D array houses[][] consisting of N 2D coordinates {x, y} where each coordinate represents the location of each house, the task is to find the minimum cost to connect all the houses of the city.
Cost of connecting two houses is the Manhattan Distance between the two points (xi, yi) and (xj, yj) i.e., |xi – xj| + |yi – yj|, where |p| denotes the absolute value of p.
Examples:
Input: houses[][] = [[0, 0], [2, 2], [3, 10], [5, 2], [7, 0]]
Output: 20
Explanation:Connect house 1 (0, 0) with house 2 (2, 2) with cost = 4
Connect house 2 (2, 2) with house 3 (3, 10) with cost =9Â
Connect house 2 (2, 2) with house 4 (5, 2) with cost =3Â
At last, connect house 4 (5, 2) with house 5 (7, 0) with cost 4.
All the houses are connected now.
The overall minimum cost is 4 + 9 + 3 + 4 = 20.Input: houses[][] = [[3, 12], [-2, 5], [-4, 1]]
Output: 18
Explanation:
Connect house 1 (3, 12) with house 2 (-2, 5) with cost = 12
Connect house 2 (-2, 5) with house 3 (-4, 1) with cost = 6
All the houses are connected now.
The overall minimum cost is 12 + 6 = 18.
Approach: The idea is to create a weighted graph from the given information with weights between any pair of edges equal to the cost of connecting them, say Ci i.e., the Manhattan distance between the two coordinates. Once the graph is generated, apply Kruskal’s Algorithm to find the Minimum Spanning Tree of the graph using Disjoint Set. Finally, print the minimum cost.
Below is the implementation of the above approach:
C++
// C++ program for the above approachÂ
#include <bits/stdc++.h>using namespace std;Â
vector<int> parent, size;Â
// Utility function to find set of an// element v using path compression// techniqueint find_set(int v){    // If v is the parent    if (v == parent[v])        return v;Â
    // Otherwise, recursively    // find its parent    return parent[v]           = find_set(parent[v]);}Â
// Function to perform union// of the sets a and bint union_sets(int a, int b){    // Find parent of a and b    a = find_set(a);    b = find_set(b);Â
    // If parent are different    if (a != b) {Â
        // Swap Operation        if (size[a] < size[b])            swap(a, b);Â
        // Update parent of b as a        parent[b] = a;        size[a] += size[b];        return 1;    }Â
    // Otherwise, return 0    return 0;}Â
// Function to create a Minimum Cost// Spanning tree for given housesvoid MST(int houses[][2], int n){    // Stores adjacency list of graph    vector<pair<int, pair<int, int> > > v;Â
    // Traverse each coordinate    for (int i = 0; i < n; i++) {Â
        for (int j = i + 1; j < n; j++) {Â
            // Find the Manhattan distance            int p = abs(houses[i][0]                        - houses[j][0]);Â
            p += abs(houses[i][1]                     - houses[j][1]);Â
            // Add the edges            v.push_back({ p, { i, j } });        }    }Â
    parent.resize(n);    size.resize(n);Â
    // Sort all the edges    sort(v.begin(), v.end());Â
    // Initialize parent[] and size[]    for (int i = 0; i < n; i++) {        parent[i] = i, size[i] = 1;    }Â
    /// Stores the minimum cost    int ans = 0;Â
    // Finding the minimum cost    for (auto x : v) {Â
        // Perform the union operation        if (union_sets(x.second.first,                       x.second.second)) {            ans += x.first;        }    }Â
    // Print the minimum cost    cout << ans;}Â
// Driver Codeint main(){    // Given houses    int houses[][2] = { { 0, 0 }, { 2, 2 },                         { 3, 10 }, { 5, 2 },                         { 7, 0 }};Â
    int N = sizeof(houses)            / sizeof(houses[0]);Â
    // Function Call    MST(houses, N);Â
    return 0;} |
Java
// Java program for the above approachimport java.util.*;Â
// Class for DSU implementationclass DSU{Â Â Â Â Â int parent[];int rank[];Â
// Constructor to initialize DSUDSU(int n){Â Â Â Â parent = new int[n];Â Â Â Â rank = new int[n];Â Â Â Â for(int i = 0; i < n; i++) Â Â Â Â {Â Â Â Â Â Â Â Â parent[i] = -1;Â Â Â Â Â Â Â Â rank[i] = 1;Â Â Â Â }}Â
// Utility function to find set of an// element v using path compression// techniqueint find_set(int v){         // If v is the parent    if (parent[v] == -1)        return v;             // Otherwise, recursively    // find its parent    return parent[v] = find_set(parent[v]);}Â
// Function to perform union// of the sets a and bvoid union_sets(int a, int b){         // Find parent of a and b    int p1 = find_set(a);    int p2 = find_set(b);         // If parent are different    if (p1 != p2)     {                 // Swap Operation        if (rank[p1] > rank[p2])         {            parent[p2] = p1;            rank[p1] += rank[p2];        }        else        {            parent[p1] = p2;            rank[p2] += rank[p1];        }    }}}Â
class GFG{Â Â Â Â Â // Function to create a Minimum Cost// Spanning tree for given housesstatic void MST(int houses[][], int n){Â Â Â Â int ans = 0;Â Â Â Â ArrayList<int[]> edges = new ArrayList<>();Â
    // Traverse each coordinate    for(int i = 0; i < n; i++)    {        for(int j = i + 1; j < n; j++)         {                         // Find the Manhattan distance            int p = Math.abs(houses[i][0] -                              houses[j][0]);Â
            p += Math.abs(houses[i][1] -                           houses[j][1]);                                       // Add the edges            edges.add(new int[]{ p, i, j });        }    }Â
    // Sorting arraylist using custome comparator    // on the basis of weight i.e first element in    // array object stored in Arraylist    Collections.sort(edges, new Comparator<int[]>()    {        @Override public int compare(int[] o1, int[] o2)        {            return Integer.compare(o1[0], o2[0]);        }    });Â
    // Calling DSU class    DSU d = new DSU(n);    for(int i = 0; i < edges.size(); i++)     {        int from = edges.get(i)[1];        int to = edges.get(i)[2];Â
        // Checking if they lie in different component        // or not i.e they have same parent or not in        // DSU        if (d.find_set(from) != d.find_set(to))        {                         // Calling union_sets            d.union_sets(from, to);            ans += edges.get(i)[0];        }    }Â
    // Printing the minimum cost    System.out.println(ans);}Â
// Driver codepublic static void main(String args[]){         // Graph in form of 2D array    int houses[][] = { { 0, 0 }, { 2, 2 },                       { 3, 10 }, { 5, 2 },                       { 7, 0 } };    int n = houses.length;         // Function Call    MST(houses, n);}}Â
// This code is contributed by Rahul Verma |
Python3
# Python3 program for the above approachparent = [0] * 100size = [0] * 100Â
# Utility function to find set of an# element v using path compression# techniquedef find_set(v):       #if v is parent    if (v == parent[v]):        return vÂ
    # Otherwise, recursively    # find its parent    parent[v] = find_set(parent[v])Â
    return parent[v]Â
# Function to perform union# of the sets a and bdef union_sets(a, b):         # Find parent of a and b    a = find_set(a)    b = find_set(b)Â
    # If parent are different    if (a != b):                 # Swap Operation        if (size[a] < size[b]):            a, b = b, aÂ
        # Update parent of b as a        parent[b] = a        size[a] += size[b]        return 1Â
    # Otherwise, return 0    return 0Â
# Function to create a Minimum Cost# Spanning tree for given housesdef MST(houses, n):         # Stores adjacency list of graph    v = []Â
    # Traverse each coordinate    for i in range(n):        for j in range(i + 1, n):Â
            # Find the Manhattan distance            p = abs(houses[i][0] -                    houses[j][0])Â
            p += abs(houses[i][1] -                     houses[j][1])Â
            # Add the edges            v.append([p, i, j])Â
    # Sort all the edges    v = sorted(v)Â
    # Initialize parent[] and size[]    for i in range(n):        parent[i] = i        size[i] = 1Â
    # Stores the minimum cost    ans = 0Â
    # Finding the minimum cost    for x in v:Â
        # Perform the union operation        if (union_sets(x[1], x[2])):            ans += x[0]                 # Print the minimum cost    print(ans)Â
# Driver Codeif __name__ == '__main__':         # Given houses    houses = [ [ 0, 0 ], [ 2, 2 ],               [ 3, 10 ], [ 5, 2 ],               [ 7, 0 ] ]Â
    N = len(houses)Â
    # Function Call    MST(houses, N)Â
# This code is contributed by mohit kumar 29 |
Javascript
<script>Â
// JavaScript program for the above approachlet parent = new Array(100).fill(0)let size = new Array(100).fill(0)Â
// Utility function to find set of an// element v using path compression// techniquefunction find_set(v){         // If v is the parent    if (v == parent[v])        return vÂ
    // Otherwise, recursively    // find its parent    parent[v] = find_set(parent[v])Â
    return parent[v]}Â
// Function to perform union// of the sets a and bfunction union_sets(a, b){         // Find parent of a and b    a = find_set(a)    b = find_set(b)Â
    // If parent are different    if (a != b){                 // Swap Operation        if (size[a] < size[b]){            a, b = b, a        }Â
        // Update parent of b as a        parent[b] = a        size[a] += size[b]        return 1    }Â
    // Otherwise, return 0    return 0}Â
// Function to create a Minimum Cost// Spanning tree for given housesfunction MST(houses, n){         // Stores adjacency list of graph    let v = []Â
    // Traverse each coordinate    for(let i=0;i<n;i++){        for(let j=i+1;j<n;j++){Â
            // Find the Manhattan distance            let p = Math.abs(houses[i][0] -                    houses[j][0])Â
            p += Math.abs(houses[i][1] -                    houses[j][1])Â
            // Add the edges            v.push([p, i, j])        }    }Â
    // Sort all the edges    v.sort((a,b)=>a[0]-b[0])Â
    // Initialize parent[] and size[]    for(let i=0;i<n;i++){        parent[i] = i        size[i] = 1    }Â
    // Stores the minimum cost    let ans = 0Â
    // Finding the minimum cost    for(let x of v){Â
        // Perform the union operation        if (union_sets(x[1], x[2]))            ans += x[0]Â
    }                 // Print the minimum cost    document.write(ans,"</br>")}Â
// Driver Code     // Given houseslet houses = [ [ 0, 0 ], [ 2, 2 ], [ 3, 10 ], [ 5, 2 ],[ 7, 0 ] ]Â
let N = houses.lengthÂ
// Function CallMST(houses, N)Â
// This code is contributed by shinjanpatraÂ
</script> |
C#
using System;Â
class UnionFind{Â Â Â Â private int[] parent;Â Â Â Â private int[] size;Â
    public UnionFind(int n)    {        parent = new int[n];        size = new int[n];Â
        for (int i = 0; i < n; i++)        {            parent[i] = i;            size[i] = 1;        }    }    // Utility function to find set of an//element v using path compression// techniqueÂ
    public int FindSet(int v)    {        //if v is parent        if (v == parent[v])        {            return v;        }        //Otherwise, recursively    //find its parentÂ
        parent[v] = FindSet(parent[v]);        return parent[v];    }    // Function to perform union// of the sets a and bÂ
    public int UnionSets(int a, int b)    {         // Find parent of a and b        a = FindSet(a);        b = FindSet(b); // If parent are different        if (a != b)        {            if (size[a] < size[b])            {                 // Swap Operation                int temp = a;                a = b;                b = temp;            }            //Update parent of b as aÂ
            parent[b] = a;            size[a] += size[b];            return 1;        }Â
        return 0;    }}Â
class Program{    static void Main(string[] args)    {        int[][] houses = new int[][] {            new int[] { 0, 0 },            new int[] { 2, 2 },            new int[] { 3, 10 },            new int[] { 5, 2 },            new int[] { 7, 0 }        };Â
        int n = houses.Length;Â
        Tuple<int, int, int>[] edges = new Tuple<int, int, int>[(n * (n - 1)) / 2];        int count = 0;         // Traverse each coordinateÂ
        for (int i = 0; i < n; i++)        {            for (int j = i + 1; j < n; j++)            {                int p = Math.Abs(houses[i][0] - houses[j][0]) +                        Math.Abs(houses[i][1] - houses[j][1]);                edges[count++] = Tuple.Create(p, i, j);            }        }        // Sort all the edgesÂ
        Array.Sort(edges, (a, b) => a.Item1.CompareTo(b.Item1));Â
        UnionFind uf = new UnionFind(n);Â
        int ans = 0;Â
        foreach (var edge in edges)        {            if (uf.UnionSets(edge.Item2, edge.Item3) == 1)            {                ans += edge.Item1;            }        }Â
        Console.WriteLine(ans);    }} |
20
Â
Time Complexity: O(N2)
Auxiliary Space: O(N2)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

