class Solution {
public:
vector<int>Res;//结果
vector<bool>secret;//知晓秘密的人
vector<int>father;
void build(int n, int firstPerson){
secret.resize(n + 1, false);
father.resize(n + 1);
for(int i = 0; i < n; i++){
father[i] = i;
}
secret[0] = true;//最初的专家
father[firstPerson] = 0;//第一个知晓秘密的专家
}
int find(int i){
if(i != father[i]){
father[i] = find(father[i]);
}
return father[i];
}
void Union(int a, int b){
int fa = find(a);
int fb = find(b);
if(fa != fb){
father[fb] = fa;//父指向fa,则secret也应当更新fa
secret[fa] = secret[fa]||secret[fb];
}
}
vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson) {
int l, r, size;
size = meetings.size();
build(n, firstPerson);//Init
sort(meetings.begin(), meetings.end(), [](const vector<int>&a, const vector<int>& b){
return a[2] < b[2];
});
for(l = 0; l < size; ){
r = l;
while(r + 1 < size && meetings[r][2] == meetings[r + 1][2]){
r++;
}//寻找相同时间的会议
for(int i = l; i <= r; i++){
Union(meetings[i][0], meetings[i][1]);
}//合并在这些时间开会的人
//将未知秘密的人暂时拆分
for(int i = l; i <= r; i++){
int a, b;
a = meetings[i][0];
b = meetings[i][1];
if(!secret[find(a)]){
father[a] = a;
}
if(!secret[find(b)]){
father[b] = b;
}
}
l = r + 1;
}
for(l = 0; l < n; l++){
if(secret[find(l)]){
Res.push_back(l);
}
}
return Res;
}
};
leetcode 2092 找出所有知晓秘密的专家
最新推荐文章于 2025-04-22 18:27:45 发布