Find the array to which each element in given queries belong along with count of elements
Last Updated :
01 Dec, 2022
Given an array of pairs arr[][] of length N, and an array queries[] of length M, and an integer R, where each query contains an integer from 1 to R, the task for every queries[i] is to find the set to which it belongs and find the total number of elements of the set.
Note: Initially every integer from 1 to R belongs to the distinct set.
Examples:
Input: R = 5, arr[][] = {{1, 2}, {2, 3}, {4, 5}}, queries[] = {2, 4, 1, 3}
Output: 3 2 3 3
Explanation:
After making the sets from the arr[] pairs, {1, 2, 3}, {4, 5}
For the first query: 2 belongs to the set {1, 2, 3} and the total number of elements is 3.
For the second query: 4 belongs to the set {4, 5} and the total number of elements is 2.
For the third query: 1 belongs to the set {1, 2, 3} and the total number of elements is 3.
For the fourth query: 3 belongs to the set {1, 2, 3} and the total number of elements is 3.
Input: R = 6, arr[][] = {{1, 3}, {2, 4}}, queries[] = {2, 5, 6, 1}
Output: 2 1 1 2
Approach: The given problem can be solved using the Disjoint Set Union. Initially, all the elements are in different sets, process the arr[] and do union operation on the given pairs and in union update, the total[] value for the parent element. For each query do find operation and for the returned parent element find the size of the current set as the value of total[parent]. Follow the steps below to solve the problem:
- Initialize the vectors parent(R + 1), rank(R + 1, 0), total(R + 1, 1).
- Iterate over the range [1, R+1) using the variable i and set the value of parent[I] as I.
- Iterate over the range [1, N-1] using the variable i and perform the Union Operation as Union(parent, rank, total, arr[I].first, arr[I].second).
- Iterate over the range [1, M – 1] using the variable i and perform the following steps:
- Call for function for finding the parent of the current element queries[i] as Find(parent, queries[I]).
- Print the value of total[i] as the size of the current set.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int Find(vector< int >& parent, int a)
{
return parent[a]
= (parent[a] == a)
? a
: (Find(parent, parent[a]));
}
void Union(vector< int >& parent,
vector< int >& rank,
vector< int >& total,
int a, int b)
{
a = Find(parent, a);
b = Find(parent, b);
if (a == b)
return ;
if (rank[a] == rank[b]) {
rank[a]++;
}
if (rank[a] < rank[b]) {
int temp = a;
a = b;
b = temp;
}
parent[b] = a;
total[a] += total[b];
}
void findTotNumOfSet(vector<pair< int , int > >& arr,
vector< int >& queries,
int R, int N, int M)
{
vector< int > parent(R + 1);
vector< int > rank(R + 1, 0);
vector< int > total(R + 1, 1);
for ( int i = 1; i < R + 1; i++) {
parent[i] = i;
}
for ( int i = 0; i < N; i++) {
Union(parent, rank, total,
arr[i].first,
arr[i].second);
}
for ( int i = 0; i < M; i++) {
int P = Find(parent, queries[i]);
cout << total[P] << " " ;
}
}
int main()
{
int R = 5;
vector<pair< int , int > > arr{ { 1, 2 },
{ 2, 3 },
{ 4, 5 } };
vector< int > queries{ 2, 4, 1, 3 };
int N = arr.size();
int M = queries.size();
findTotNumOfSet(arr, queries, R, N, M);
return 0;
}
|
Java
class GFG
{
static int Find( int [] parent, int a)
{
return parent[a]
= (parent[a] == a)
? a
: (Find(parent, parent[a]));
}
static void Union( int [] parent,
int [] rank,
int [] total,
int a, int b)
{
a = Find(parent, a);
b = Find(parent, b);
if (a == b)
return ;
if (rank[a] == rank[b]) {
rank[a]++;
}
if (rank[a] < rank[b]) {
int temp = a;
a = b;
b = temp;
}
parent[b] = a;
total[a] += total[b];
}
static void findTotNumOfSet( int [][] arr,
int [] queries,
int R, int N, int M)
{
int [] parent = new int [R + 1 ];
int [] rank = new int [R + 1 ];
int [] total = new int [R + 1 ];
for ( int i = 0 ; i < total.length; i++) {
total[i] = 1 ;
}
for ( int i = 1 ; i < R + 1 ; i++) {
parent[i] = i;
}
for ( int i = 0 ; i < N; i++) {
Union(parent, rank, total,
arr[i][ 0 ],
arr[i][ 1 ]);
}
for ( int i = 0 ; i < M; i++) {
int P = Find(parent, queries[i]);
System.out.print(total[P]+ " " );
}
}
public static void main(String[] args)
{
int R = 5 ;
int [][] arr = { { 1 , 2 },
{ 2 , 3 },
{ 4 , 5 } };
int [] queries = { 2 , 4 , 1 , 3 };
int N = arr.length;
int M = queries.length;
findTotNumOfSet(arr, queries, R, N, M);
}
}
|
Python3
def Find(parent, a):
if (parent[a] = = a):
return a
else :
return Find(parent, parent[a])
def Union(parent, rank, total, a, b):
a = Find(parent, a)
b = Find(parent, b)
if (a = = b):
return
if (rank[a] = = rank[b]):
rank[a] + = 1
if (rank[a] < rank[b]):
temp = a
a = b
b = temp
parent[b] = a
total[a] + = total[b]
def findTotNumOfSet(arr, queries, R, N, M):
parent = [ None ] * (R + 1 )
rank = [ 0 ] * (R + 1 )
total = [ 1 ] * (R + 1 )
for i in range ( 1 , R + 1 ):
parent[i] = i
for i in range (N):
Union(parent, rank, total, arr[i][ 0 ], arr[i][ 1 ])
for i in range (M):
P = Find(parent, queries[i])
print (total[P], end = " " )
R = 5
arr = [[ 1 , 2 ], [ 2 , 3 ], [ 4 , 5 ]]
queries = [ 2 , 4 , 1 , 3 ]
N = len (arr)
M = len (queries)
findTotNumOfSet(arr, queries, R, N, M)
|
C#
using System;
public class GFG
{
static int Find( int [] parent, int a)
{
return parent[a]
= (parent[a] == a)
? a
: (Find(parent, parent[a]));
}
static void Union( int [] parent,
int [] rank,
int [] total,
int a, int b)
{
a = Find(parent, a);
b = Find(parent, b);
if (a == b)
return ;
if (rank[a] == rank[b]) {
rank[a]++;
}
if (rank[a] < rank[b]) {
int temp = a;
a = b;
b = temp;
}
parent[b] = a;
total[a] += total[b];
}
static void findTotNumOfSet( int [,] arr,
int [] queries,
int R, int N, int M)
{
int [] parent = new int [R + 1];
int [] rank = new int [R + 1];
int [] total = new int [R + 1];
for ( int i = 0; i < total.Length; i++) {
total[i] = 1;
}
for ( int i = 1; i < R + 1; i++) {
parent[i] = i;
}
for ( int i = 0; i < N; i++) {
Union(parent, rank, total,
arr[i,0],
arr[i,1]);
}
for ( int i = 0; i < M; i++) {
int P = Find(parent, queries[i]);
Console.Write(total[P]+ " " );
}
}
public static void Main(String[] args)
{
int R = 5;
int [,] arr = { { 1, 2 },
{ 2, 3 },
{ 4, 5 } };
int [] queries = { 2, 4, 1, 3 };
int N = arr.GetLength(0);
int M = queries.GetLength(0);
findTotNumOfSet(arr, queries, R, N, M);
}
}
|
Javascript
<script>
function Find(parent, a)
{
return (parent[a] = parent[a] == a ? a : Find(parent, parent[a]));
}
function Union(parent, rank, total, a, b)
{
a = Find(parent, a);
b = Find(parent, b);
if (a == b) return ;
if (rank[a] == rank[b]) {
rank[a]++;
}
if (rank[a] < rank[b]) {
let temp = a;
a = b;
b = temp;
}
parent[b] = a;
total[a] += total[b];
}
function findTotNumOfSet(arr, queries, R, N, M)
{
let parent = new Array(R + 1);
let rank = new Array(R + 1).fill(0);
let total = new Array(R + 1).fill(1);
for (let i = 1; i < R + 1; i++)
{
parent[i] = i;
}
for (let i = 0; i < N; i++)
{
Union(parent, rank, total, arr[i][0], arr[i][1]);
}
for (let i = 0; i < M; i++)
{
let P = Find(parent, queries[i]);
document.write(total[P] + " " );
}
}
let R = 5;
let arr = [
[1, 2],
[2, 3],
[4, 5],
];
let queries = [2, 4, 1, 3];
let N = arr.length;
let M = queries.length;
findTotNumOfSet(arr, queries, R, N, M);
</script>
|
Time Complexity: O(M*log R)
Auxiliary Space: O(R)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...