题目描述
给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号。另外给你一个下标从 0 开始的二维整数数组 meetings ,其中 meetings[i] = [xi, yi, timei] 表示专家 xi 和专家 yi 在时间 timei 要开一场会。一个专家可以同时参加 多场会议 。最后,给你一个整数 firstPerson 。
专家 0 有一个 秘密 ,最初,他在时间 0 将这个秘密分享给了专家 firstPerson 。接着,这个秘密会在每次有知晓这个秘密的专家参加会议时进行传播。更正式的表达是,每次会议,如果专家 xi 在时间 timei 时知晓这个秘密,那么他将会与专家 yi 分享这个秘密,反之亦然。
秘密共享是 瞬时发生 的。也就是说,在同一时间,一个专家不光可以接收到秘密,还能在其他会议上与其他专家分享。
在所有会议都结束之后,返回所有知晓这个秘密的专家列表。你可以按 任何顺序 返回答案。
思路分析
- 多源bfs
- ac之前超时的原因:每次的"源"有问题,可能在一次时间点,并不是所有的专家都参与了传播的作用,要在一次循环开始进行筛选即可
代码如下
#define inter(i) for(int i=0;i<n;i++)
#define interS(i,t) for(auto &t:i)
using Relation=map<int,unordered_map<int,vector<int>>>;
class Solution {
public:
vector<int> s,vis;
vector<int> findAllPeople(int n, vector<vector<int>>& meetings, int firstPerson) {
vector<int> v(n); //记录知晓的专家编号
v[0]=1; v[firstPerson]=1;
Relation mp2; //保存相同时间的关系图
interS(meetings,t){
mp2[t[2]][t[1]].push_back(t[0]);
mp2[t[2]][t[0]].push_back(t[1]);
}
for(auto &&[_,t]:mp2){
int flag=0;
queue<int> q;
interS(t,i)
if(v[i.first]==1)
q.push(i.first);
while(!q.empty()){
auto topQ=q.front();
interS(t[topQ],t2){
if(!v[t2]){
v[t2]=1;
q.push(t2);
}
}
q.pop();
}
}
inter(i)
if(v[i]==1) s.push_back(i);
return s;
}
};