Consider a special social network where people are called connected if one person is connected to other with any number of intermediate connections. For example if a person x is connected with y and y is connected with z, then x is also considered to be connected with z. We are given a set of friend requests as input. We are also given a set of queries where each query has input pair i and j. For each query, we need to tell whether i and j are connected or not.

**Examples:**

Input :Connections :

connect(0, 1), connect(1, 2), connect(0, 3), connect(5, 6), connect (0, 7)

areConnected(2, 7)

areConnected(2, 6)

areConnected(1, 7)

Output :

Yes

No

Yes

Explanation : Note that 0 is connected to 2 and 0 is also connected to 7. Therefore 2 and 7 are considered as connected.

Input :Connections :

connect(0, 2), connect(4, 2), connect(1, 3)

areConnected(0, 4)

areConnected(0, 1)

Output :

Yes

No

The idea is to use disjoint set data structure. With this data structure, we can solve all queries in O(1) amortized time.

`// A Java program to implement Special Social Network ` `// using Disjoint Set Data Structure. ` `import` `java.io.*; ` `import` `java.util.*; ` ` ` `class` `DisjointUnionSets { ` ` ` `int` `[] rank, parent; ` ` ` `int` `n; ` ` ` ` ` `// Constructor ` ` ` `public` `DisjointUnionSets(` `int` `n) ` ` ` `{ ` ` ` `rank = ` `new` `int` `[n]; ` ` ` `parent = ` `new` `int` `[n]; ` ` ` `this` `.n = n; ` ` ` `makeSet(); ` ` ` `} ` ` ` ` ` `// Creates n sets with single item in each ` ` ` `void` `makeSet() ` ` ` `{ ` ` ` `for` `(` `int` `i = ` `0` `; i < n; i++) { ` ` ` ` ` `// Initially, all elements are in ` ` ` `// their own set. ` ` ` `parent[i] = i; ` ` ` `} ` ` ` `} ` ` ` ` ` `// Returns representative of x's set ` ` ` `int` `find(` `int` `x) ` ` ` `{ ` ` ` `// Finds the representative of the set ` ` ` `// that x is an element of ` ` ` `if` `(parent[x] != x) { ` ` ` ` ` `// if x is not the parent of itself ` ` ` `// Then x is not the representative of ` ` ` `// his set, ` ` ` `parent[x] = find(parent[x]); ` ` ` ` ` `// so we recursively call Find on its parent ` ` ` `// and move i's node directly under the ` ` ` `// representative of this set ` ` ` `} ` ` ` ` ` `return` `parent[x]; ` ` ` `} ` ` ` ` ` `// Unites the set that includes x and the set ` ` ` `// that includes x ` ` ` `void` `connect(` `int` `x, ` `int` `y) ` ` ` `{ ` ` ` `// Find representatives of two sets ` ` ` `int` `xRoot = find(x), yRoot = find(y); ` ` ` ` ` `// Elements are in the same set, no need ` ` ` `// to unite anything. ` ` ` `if` `(xRoot == yRoot) ` ` ` `return` `; ` ` ` ` ` `// If x's rank is less than y's rank ` ` ` `if` `(rank[xRoot] < rank[yRoot]) ` ` ` ` ` `// Then move x under y so that depth ` ` ` `// of tree remains less ` ` ` `parent[xRoot] = yRoot; ` ` ` ` ` `// Else if y's rank is less than x's rank ` ` ` `else` `if` `(rank[yRoot] < rank[xRoot]) ` ` ` ` ` `// Then move y under x so that depth of ` ` ` `// tree remains less ` ` ` `parent[yRoot] = xRoot; ` ` ` ` ` `else` `// if ranks are the same ` ` ` `{ ` ` ` `// Then move y under x (doesn't matter ` ` ` `// which one goes where) ` ` ` `parent[yRoot] = xRoot; ` ` ` ` ` `// And increment the the result tree's ` ` ` `// rank by 1 ` ` ` `rank[xRoot] = rank[xRoot] + ` `1` `; ` ` ` `} ` ` ` `} ` ` ` ` ` `boolean` `areConnected(` `int` `i, ` `int` `j) ` ` ` `{ ` ` ` `return` `find(i) == find(j); ` ` ` `} ` `} ` ` ` `// Driver code ` `public` `class` `Main { ` ` ` `public` `static` `void` `main(String[] args) ` ` ` `{ ` ` ` `// Let there be 5 persons with ids as ` ` ` `// 0, 1, 2, 3 and 4 ` ` ` `int` `n = ` `5` `; ` ` ` `DisjointUnionSets dus = ` `new` `DisjointUnionSets(n); ` ` ` ` ` `// 0 is a friend of 2 ` ` ` `dus.connect(` `0` `, ` `2` `); ` ` ` ` ` `// 4 is a friend of 2 ` ` ` `dus.connect(` `4` `, ` `2` `); ` ` ` ` ` `// 3 is a friend of 1 ` ` ` `dus.connect(` `3` `, ` `1` `); ` ` ` ` ` `// Check if 4 is a friend of 0 ` ` ` `if` `(dus.areConnected(` `0` `, ` `4` `)) ` ` ` `System.out.println(` `"Yes"` `); ` ` ` `else` ` ` `System.out.println(` `"No"` `); ` ` ` ` ` `// Check if 1 is a friend of 0 ` ` ` `if` `(dus.areConnected(` `0` `, ` `1` `)) ` ` ` `System.out.println(` `"Yes"` `); ` ` ` `else` ` ` `System.out.println(` `"No"` `); ` ` ` `} ` `} ` |

*chevron_right*

*filter_none*

**Output:**

Yes No

Attention reader! Don’t stop learning now. Get hold of all the important CS Theory concepts for SDE interviews with the CS Theory Course at a student-friendly price and become industry ready.

## Recommended Posts:

- Creating a Network in Docker and Connecting a Container to That Network
- Introduction to the Probabilistic Data Structure
- Types of Sources of Data in Data Mining
- Processing of Raw Data to Tidy Data in R
- Data Normalization in Data Mining
- Data Integration in Data Mining
- Introduction to Artificial Neural Network | Set 2
- A single neuron neural network in Python
- Introduction to ANN | Set 4 (Network Architectures)
- Applying Convolutional Neural Network on mnist dataset
- Generative Adversarial Network (GAN)
- Pattern Recognition | Basics and Design Principles
- Difference Between Architectural Style, Architectural Patterns and Design Patterns
- Getting Started with System Design
- Disjoint Set Data Structures
- Data Mining
- Data Warehousing
- Classifying data using Support Vector Machines(SVMs) in Python
- Data Preprocessing for Machine learning in Python
- Analysis of test data using K-Means Clustering in Python

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.