Formatted question description: https://leetcode.ca/all/2092.html

# 2092. Find All People With Secret (Hard)

You are given an integer `n`

indicating there are `n`

people numbered from `0`

to `n - 1`

. You are also given a **0-indexed** 2D integer array `meetings`

where `meetings[i] = [x`

indicates that person _{i}, y_{i}, time_{i}]`x`

and person _{i}`y`

have a meeting at _{i}`time`

. A person may attend _{i}**multiple meetings** at the same time. Finally, you are given an integer `firstPerson`

.

Person `0`

has a **secret** and initially shares the secret with a person `firstPerson`

at time `0`

. This secret is then shared every time a meeting takes place with a person that has the secret. More formally, for every meeting, if a person `x`

has the secret at _{i}`time`

, then they will share the secret with person _{i}`y`

, and vice versa._{i}

The secrets are shared **instantaneously**. That is, a person may receive the secret and share it with people in other meetings within the same time frame.

Return *a list of all the people that have the secret after all the meetings have taken place. *You may return the answer in **any order**.

**Example 1:**

Input:n = 6, meetings = [[1,2,5],[2,3,8],[1,5,10]], firstPerson = 1Output:[0,1,2,3,5]Explanation:At time 0, person 0 shares the secret with person 1. At time 5, person 1 shares the secret with person 2. At time 8, person 2 shares the secret with person 3. At time 10, person 1 shares the secret with person 5. Thus, people 0, 1, 2, 3, and 5 know the secret after all the meetings.

**Example 2:**

Input:n = 4, meetings = [[3,1,3],[1,2,2],[0,3,3]], firstPerson = 3Output:[0,1,3]Explanation:At time 0, person 0 shares the secret with person 3. At time 2, neither person 1 nor person 2 know the secret. At time 3, person 3 shares the secret with person 0 and person 1. Thus, people 0, 1, and 3 know the secret after all the meetings.

**Example 3:**

Input:n = 5, meetings = [[3,4,2],[1,2,1],[2,3,1]], firstPerson = 1Output:[0,1,2,3,4]Explanation:At time 0, person 0 shares the secret with person 1. At time 1, person 1 shares the secret with person 2, and person 2 shares the secret with person 3. Note that person 2 can share the secret at the same time as receiving it. At time 2, person 3 shares the secret with person 4. Thus, people 0, 1, 2, 3, and 4 know the secret after all the meetings.

**Example 4:**

Input:n = 6, meetings = [[0,2,1],[1,3,1],[4,5,1]], firstPerson = 1Output:[0,1,2,3]Explanation:At time 0, person 0 shares the secret with person 1. At time 1, person 0 shares the secret with person 2, and person 1 shares the secret with person 3. Thus, people 0, 1, 2, and 3 know the secret after all the meetings.

**Constraints:**

`2 <= n <= 10`

^{5}`1 <= meetings.length <= 10`

^{5}`meetings[i].length == 3`

`0 <= x`

_{i}, y_{i }<= n - 1`x`

_{i}!= y_{i}`1 <= time`

_{i}<= 10^{5}`1 <= firstPerson <= n - 1`

**Similar Questions**:

## Solution 1. Union Find

Sort `meetings`

in ascending order of meeting time.

Visit the meetings happening at the same time together.

We can connect the two persons in the same meeting using a UnionFind.

Tricky point here: After traversing this batch of meetings, we reset the persons who don’t know the secret by checking if he/she is connected to person 0. With UnionFind, reseting means setting `id[x] = x`

.

In the end, we add all the persons who are connected to person 0 into the answer array.

```
// OJ: https://leetcode.com/problems/find-all-people-with-secret/
// Time: O(MlogM + N) where `M` is the length of `meetings`
// Space: O(N)
class UnionFind {
vector<int> id;
public:
UnionFind(int n) : id(n) {
iota(begin(id), end(id), 0);
}
void connect(int a, int b) {
id[find(b)] = find(a);
}
int find(int a) {
return id[a] == a ? a : (id[a] = find(id[a]));
}
bool connected(int a, int b) {
return find(a) == find(b);
}
void reset(int a) { id[a] = a; }
};
class Solution {
public:
vector<int> findAllPeople(int n, vector<vector<int>>& A, int firstPerson) {
sort(begin(A), end(A), [](auto &a, auto &b) { return a[2] < b[2]; }); // Sort the meetings in ascending order of meeting time
int i = 0, M = A.size();
UnionFind uf(n);
uf.connect(0, firstPerson); // Connect person 0 with the first person
vector<int> ppl;
while (i < M) {
ppl.clear();
int time = A[i][2];
while (i < M && A[i][2] == time) { // For all the meetings happending at the same time
uf.connect(A[i][0], A[i][1]); // Connect the two persons
ppl.push_back(A[i][0]); // Add both persons into the pool
ppl.push_back(A[i][1]);
++i;
}
for (int n : ppl) { // For each person in the pool, check if he/she's connected with person 0.
if (!uf.connected(0, n)) uf.reset(n); // If not, this person doesn't have secret, reset it.
}
}
vector<int> ans;
for (int j = 0; j < n; ++j) {
if (uf.connected(0, j)) ans.push_back(j); // Push all the persons who are connected with person 0 into answer array
}
return ans;
}
};
```

## Discuss

https://leetcode.com/problems/find-all-people-with-secret/discuss/1599815/C%2B%2B-Union-Find