New update is available. Click here to update.

Last Updated: 3 Apr, 2021

Moderate

```
1) An element of the ‘COORDINATES’ array is a pair of ‘X' and ‘Y’ coordinates of a point, i.e., COORDINATES[i] = (Xi, Yi).
2) |DISTANCE| represents the absolute value of distance.
3) All points are considered to be connected if there is exactly one simple path between two points.
4) According to Wikipedia, a simple path is a path in a plane that does not have repeating points.
```

```
The first line of input contains an integer 'T' representing the number of test cases.
The first line of each test case contains an integer ‘N’ representing the number of points in the ‘COORDINATES’ array.
The next ‘N’ lines of each test case contain two space-separated integers representing the ‘X and ‘Y’ coordinates of a point.
```

```
For each test case, print a single line containing a single integer denoting the minimum cost to make all the points connected.
The output of each test case will be printed in a separate line.
```

```
You do not need to print anything, it has already been taken care of. Just implement the given function.
```

```
1 <= T <= 5
1 <= N <= 1000
10 ^ -6 <= X, Y <= 10 ^ 6
All points are distinct.
Where ‘T’ is the number of test cases, ‘N’ is the number of points in the ‘COORDINATES’ array, ‘X’, ‘Y’ is the x and y coordinates of a point, respectively.
Time limit: 1 sec.
```

The problem indirectly refers to finding the cost of the minimum spanning tree of the graph formed by given points.

By definition, a minimum spanning tree (MST) is a subset of the edges of a connected, edge-weighted undirected graph that connects all the vertices, without any cycles and with the minimum possible total edge weight. For ‘n’ vertices, an MST has ‘n - 1’ edges.

The idea is to use Kruskal’s Algorithm to find the MST for this problem.

First, we will add all the edges (that can be formed by any two points) and their cost in a min-heap. Now, we will process each and every edge present in the min-heap one by one. Min heap ensures that edges are processed in non-decreasing order of their cost.

If the current edge in processing forms a cycle in the MST, then discard the edge; otherwise, include it in the MST. We will be adding the cost of edges included in the MST in an integer variable, ‘result’.

The process will be repeated till ‘n - 1’ edges are not included in the MST, where ‘n’ is the number of points in the ‘coordinates’ array. In the end, the ‘result’ will have the cost of MST so formed.

Note:

- We will use the Disjoint Set data structure to check for cycles in the MST build so far.
- After ‘n - 1’ edges are included in the MST, all points will be connected. So, there is no need for further processing.

Algorithm:

- Declare two integer variables, ‘result’ and ‘count’, and initialize with zero. The ‘result’ will hold the cost of the MST, and ‘count’ will hold the number of edges included in the MST.
- Create a ‘vector’ of ‘array’ of size 3 (in C++), ‘edges’ to store three elements, ‘distance’, ‘i’ and ‘j’ where ‘i’ and ‘j’ are vertices, and ‘distance’ is the distance between them.
- Run a loop from i = 0 to n - 1.
- Run a loop from j = i + 1 to n - 1.
- Calculate the distance between the ‘i’th point and ‘j’th point present in the ‘coordinates’ array and store it in the variable ‘distance’.
- Push {distance, i, j} in the ‘edges.

- Run a loop from j = i + 1 to n - 1.
- Build a min-heap, ‘pq’ by passing the contents of ‘edges’ in its constructor. The min heap will make the comparison according to ‘distance’.
- Create an object ‘ds’ of ‘DisjointSet’ and pass ‘n’ as the parameter.
- Run a loop while count < n - 1.
- Extract the element with minimum ‘distance’ from ‘pq’ and store it in the variable, ‘topElement’. Then, pop the top element from ‘pq’.
- From ‘topElement’, store the values of distance and vertices in variables ‘cost’, ‘u’ and ‘v’. (‘u’ and ‘v’ are vertices, and ‘cost’ is the distance/cost between them).
- If ds.find(u) != ds.find(v), that shows that including the edge between ‘u’ and ‘v’ will not produce a cycle in the MST. The ‘find’ function finds the representative element of a set. (If the representative element of both vertices is same, it implies they are already present in the same set, and there is a path connecting them. So, adding them again will produce a cycle).
- Add ‘cost’ in the ‘result’.
- Include the edge between ‘u’ and ‘v’ in the MST by ds.Union(u, v), which takes the union of ‘u’ and ‘v’.
- Increment count by 1.

- At the end, return ‘result’.

Description of ‘DisjointSet’ class

private:

The private part of the ‘DisjointSet’ class will contain two data members:

- parent: An integer array to store the parent of each vertex in the graph.
- rank: An integer array to store the rank of each vertex in the graph.

public:

The private part of the ‘DisjointSet’ class will contain one constructor and two member functions:

Description of ‘DisjointSet’ constructor

The constructor will take one parameter:

- n: An integer variable that represents the number of vertices in the graph (i.e., number of points in the ‘coordinates’ array).

DisjointSet(n):

- Resize the size of the ‘parent’ and ‘rank’ array to ‘n’.
- Run a loop from i = 0 to n - 1.
- Assign ‘i’ to ‘parent[i]’ and set ‘rank[i]’ to zero.

Description of ‘find’ function

The function will take one parameter:

- x: An integer variable that represents the vertex (element) whose representative element has to be searched.

find(x):

- If parent[x] == x that shows that ‘x’ itself is the representative element. So, return ‘x’.
- Else, call the ‘find’ function for ‘parent[x]’ and store the returned result in ‘parent[x]’.
- Return ‘parent[x]’.

Description of ‘Union’ function

The function will take two parameters:

- u: An integer variable that represents vertex in the graph (or point in ‘coordinates’ array).
- v : Another integer variable that represents vertex in the graph (or point in ‘coordinates’ array).

Union(u, v):

- Pass ‘u’ to the ‘find’ function and store the returned value in an integer variable, ‘uRep’.
- Pass ‘v’ to the ‘find’ function and store the returned value in an integer variable, ‘vRep’.
- If uRep == vRep that shows ‘u’ and ‘v’ are already in the same set. So, return.
- Else if rank[uRep] < rank[vRep] that shows that the rank of ‘uRep’ is less than the rank of ‘vRep’.
- Update parent of ‘uRep’ by ‘vRep’.

- Else if rank[uRep] > rank[vRep] that shows that the rank of ‘uRep’ is more than the rank of ‘vRep’.
- Update parent of ‘vRep’ by ‘uRep’.

- Else rank of ‘uRep’ and ‘vRep’ are same.
- Update parent of ‘uRep’ by ‘vRep’.
- Increment rank of ‘vRep’ by 1.

Since we are dealing with the complete graph, the total number of edges is ‘n * (n - 1) / 2’, which is in the order of ‘n ^ 2’. But our MST will contain only ‘n - 1’ edges that implies that in the previous approach, the min-heap is also storing the edges which are not relevant.The idea is to keep track of the minimal distance to each vertex using a ‘cost’ array which is updated with every addition of vertex in MST. So, a min-heap is no longer required.

In this approach, first, we will choose a source vertex (‘src’) and update its cost in the ‘cost’ array by ‘INT_MAX’ so that it is never picked again and include it in the MST by marking it visited. Then, we will find the distance of every vertex from the ‘src’ and update it in the ‘cost’ array. While doing so, we can keep track of the minimal distance vertex (say: ‘nextMin’) from ‘src’. Add the cost of ‘nextMin’ in the ‘result’ (‘result’ variable will hold the final cost of MST) and use ‘nextMin’ as new ‘src’ to find the minimal distance from it. Repeat this process till ‘n - 1’ vertices are included in the MST.

Algorithm:

- Declare two integer variables, ‘result’ and ‘count’, and initialize with zero. The ‘result’ will hold the cost of the MST, and ‘count’ will hold the number of edges included in the MST.
- Declare a boolean array, ‘visited’ of size ‘n’ to keep track of the vertices included in the MST.
- Declare an integer array, ‘cost’ of size ‘n’ and initialize it with ‘INT_MAX’. It will represent the minimum distance to the current spanning tree.
- Declare an integer variable, ‘src’, and initialize it with zero. It represents that zero is chosen as the source vertex.
- Run a loop while count < n - 1.
- Mark the ‘src’ as visited.
- Update ‘cost’ of ‘src’ by ‘INT_MAX’.
- Declare an integer variable, ‘nextMin’ representing the next vertex to be added in MST which has minimal distance from ‘src’. Initially, assign ‘src’ to ‘nextMin’.
- Run a loop from i = 0 to n - 1.
- If visited[i] == true that shows that vertex, ‘i’ has been already visited.
- So, skip the below steps.

- Else, calculate the distance between the ‘i’th vertex and ‘src’ vertex present in the ‘coordinates’ array and store it in the variable ‘distance’.
- Update the cost of ‘i’th vertex by the minimum of ‘cost[i]’ and ‘distance’.
- If cost[nextMin] > cost[i] that shows that ‘i’th vertex has less cost from ‘src’ compared to ‘nextMin’
- Update ‘nextMin’ by ‘i’.

- If visited[i] == true that shows that vertex, ‘i’ has been already visited.
- Add ‘cost[nextMin]’ to the ‘result’.
- Update ‘src’ by ‘nextMin’.
- Increment ‘count’ by 1.

- In the end, return ‘result’.