找出知晓秘密的所有专家

6 篇文章 0 订阅

题目描述

给你一个整数 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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值