查找给定查询中每个元素所属的数组以及元素计数
给定一个长度为N的数组对arr[][]和一个长度为M的数组queries[]和一个整数R ,其中每个查询包含一个从1到R的整数,每个查询[i]的任务是找到它所属的集合,并找到该集合的元素总数。
Note: Initially every integer from 1 to R belongs to the distinct set.
例子:
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
方法:给定的问题可以使用不相交集并集来解决。最初,所有元素都在不同的集合中,处理arr[]并对给定的对进行联合操作,并在联合更新中,父元素的总 []值。对于每个查询执行查找操作,并为返回的父元素查找当前集合的大小作为total[parent]的值。请按照以下步骤解决问题:
- 初始化向量parent(R + 1) 、 rank(R + 1, 0) 、 total(R + 1, 1) 。
- 使用变量i遍历范围[1, R+1)并将parent[I]的值设置为I 。
- 使用变量i遍历范围[1, N-1]并执行联合运算作为Union(parent, rank, total, arr[I].first, arr[I].second) 。
- 使用变量i迭代范围[1, M – 1]并执行以下步骤:
- 调用函数来查找当前元素的父元素queries[i]为Find(parent, queries[I]) 。
- 将total[i]的值打印为当前集合的大小。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Function to perform the find operation
// of disjoint set union
int Find(vector& parent, int a)
{
return parent[a]
= (parent[a] == a)
? a
: (Find(parent, parent[a]));
}
// Function to find the Union operation
// of disjoint set union
void Union(vector& parent,
vector& rank,
vector& total,
int a, int b)
{
// Find the parent of a and b
a = Find(parent, a);
b = Find(parent, b);
if (a == b)
return;
// If the rank are the same
if (rank[a] == rank[b]) {
rank[a]++;
}
if (rank[a] < rank[b]) {
int temp = a;
a = b;
b = temp;
}
// Update the parent for node b
parent[b] = a;
// Update the total number of
// elements of a
total[a] += total[b];
}
// Function to find the total element
// of the set which belongs to the
// element queries[i]
void findTotNumOfSet(vector >& arr,
vector& queries,
int R, int N, int M)
{
// Stores the parent elements
// of the sets
vector parent(R + 1);
// Stores the rank of the sets
vector rank(R + 1, 0);
// Stores the total number of
// elements of the sets
vector total(R + 1, 1);
for (int i = 1; i < R + 1; i++) {
// Update parent[i] to i
parent[i] = i;
}
for (int i = 0; i < N; i++) {
// Add the arr[i].first and
// arr[i].second elements to
// the same set
Union(parent, rank, total,
arr[i].first,
arr[i].second);
}
for (int i = 0; i < M; i++) {
// Find the parent element of
// the element queries[i]
int P = Find(parent, queries[i]);
// Print the total elements of
// the set which belongs to P
cout << total[P] << " ";
}
}
// Driver Code
int main()
{
int R = 5;
vector > arr{ { 1, 2 },
{ 2, 3 },
{ 4, 5 } };
vector queries{ 2, 4, 1, 3 };
int N = arr.size();
int M = queries.size();
findTotNumOfSet(arr, queries, R, N, M);
return 0;
}
Java
// Java program for the above approach
class GFG
{
// Function to perform the find operation
// of disjoint set union
static int Find(int [] parent, int a)
{
return parent[a]
= (parent[a] == a)
? a
: (Find(parent, parent[a]));
}
// Function to find the Union operation
// of disjoint set union
static void Union(int [] parent,
int [] rank,
int [] total,
int a, int b)
{
// Find the parent of a and b
a = Find(parent, a);
b = Find(parent, b);
if (a == b)
return;
// If the rank are the same
if (rank[a] == rank[b]) {
rank[a]++;
}
if (rank[a] < rank[b]) {
int temp = a;
a = b;
b = temp;
}
// Update the parent for node b
parent[b] = a;
// Update the total number of
// elements of a
total[a] += total[b];
}
// Function to find the total element
// of the set which belongs to the
// element queries[i]
static void findTotNumOfSet(int[][] arr,
int [] queries,
int R, int N, int M)
{
// Stores the parent elements
// of the sets
int [] parent = new int[R + 1];
// Stores the rank of the sets
int [] rank = new int[R + 1];
// Stores the total number of
// elements of the sets
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++) {
// Update parent[i] to i
parent[i] = i;
}
for (int i = 0; i < N; i++) {
// Add the arr[i][0] and
// arr[i][1] elements to
// the same set
Union(parent, rank, total,
arr[i][0],
arr[i][1]);
}
for (int i = 0; i < M; i++) {
// Find the parent element of
// the element queries[i]
int P = Find(parent, queries[i]);
// Print the total elements of
// the set which belongs to P
System.out.print(total[P]+ " ");
}
}
// Driver Code
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);
}
}
// This code is contributed by 29AjayKumar.
Python3
# Python3 program for the above approach
# Function to perform the find operation
# of disjoint set union
def Find(parent, a):
if (parent[a] == a):
return a
else:
return Find(parent, parent[a])
# Function to find the Union operation
# of disjoint set union
def Union(parent, rank, total, a, b):
# Find the parent of a and b
a = Find(parent, a)
b = Find(parent, b)
if(a == b):
return
# If the rank are the same
if(rank[a] == rank[b]):
rank[a] += 1
if(rank[a] < rank[b]):
temp = a
a = b
b = temp
# Update the parent for node b
parent[b] = a
# Update the total number of
# elements of a
total[a] += total[b]
# Function to find the total element
# of the set which belongs to the
# element queries[i]
def findTotNumOfSet(arr, queries, R, N, M):
# Stores the parent elements
# of the sets
parent = [None]*(R+1)
# Stores the rank of the sets
rank = [0]*(R+1)
# Stores the total number of
# elements of the sets
total = [1]*(R + 1)
for i in range(1, R + 1):
# Add the arr[i].first and
# arr[i].second elements to
# the same set
parent[i] = i
for i in range(N):
Union(parent, rank, total, arr[i][0], arr[i][1])
for i in range(M):
# Find the parent element of
# the element queries[i]
P = Find(parent, queries[i])
# Print the total elements of
# the set which belongs to P
print(total[P], end=" ")
# Driver code
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)
# This code is contributed by parthmanchanda81
C#
// C# program for the above approach
using System;
public class GFG
{
// Function to perform the find operation
// of disjoint set union
static int Find(int [] parent, int a)
{
return parent[a]
= (parent[a] == a)
? a
: (Find(parent, parent[a]));
}
// Function to find the Union operation
// of disjoint set union
static void Union(int [] parent,
int [] rank,
int [] total,
int a, int b)
{
// Find the parent of a and b
a = Find(parent, a);
b = Find(parent, b);
if (a == b)
return;
// If the rank are the same
if (rank[a] == rank[b]) {
rank[a]++;
}
if (rank[a] < rank[b]) {
int temp = a;
a = b;
b = temp;
}
// Update the parent for node b
parent[b] = a;
// Update the total number of
// elements of a
total[a] += total[b];
}
// Function to find the total element
// of the set which belongs to the
// element queries[i]
static void findTotNumOfSet(int[,] arr,
int [] queries,
int R, int N, int M)
{
// Stores the parent elements
// of the sets
int [] parent = new int[R + 1];
// Stores the rank of the sets
int [] rank = new int[R + 1];
// Stores the total number of
// elements of the sets
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++) {
// Update parent[i] to i
parent[i] = i;
}
for (int i = 0; i < N; i++) {
// Add the arr[i,0] and
// arr[i,1] elements to
// the same set
Union(parent, rank, total,
arr[i,0],
arr[i,1]);
}
for (int i = 0; i < M; i++) {
// Find the parent element of
// the element queries[i]
int P = Find(parent, queries[i]);
// Print the total elements of
// the set which belongs to P
Console.Write(total[P]+ " ");
}
}
// Driver Code
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);
}
}
// This code is contributed by shikhasingrajput
Javascript
3 2 3 3
时间复杂度: O(M*log R)
辅助空间: O(R)