当前位置: 首页 > news >正文

2092. 找出知晓秘密的所有专家

1. 辅助类:并查集 (UnionFind)

这是一个标准的并查集实现,用于维护元素之间的集合关系(连通性)。

  • fa (父节点数组): fa[i] 存储节点 i 的父节点。
  • 构造函数: ranges::iota(fa, 0) 将数组初始化为 [0, 1, 2, ..., n-1],即一开始每个人都是自己的代表,互不相连。
  • find(x): 查找 x 的根节点(代表元)。使用了路径压缩fa[x] = find(fa[x])),这能让后续的查找非常快,接近 $O(1)$。
  • merge(from, to): 将两个集合合并。
  • is_same(x, y): 判断两个人是否属于同一个集合(即是否通过某种路径相连)。

2. 核心逻辑 (findAllPeople)

第一步:预处理

// 按照 time 从小到大排序
ranges::sort(meetings, {}, [](auto& a) { return a[2]; });UnionFind uf(n);
// 一开始 0 和 firstPerson 都知道秘密
uf.merge(firstPerson, 0);
  • 排序: 秘密是按时间传播的。如果 T=10 知道了秘密,不能传播给 T=5 开会的人。所以必须按时间升序处理。
  • 初始状态: 0号专家是秘密源头,firstPerson 也在第一时间知道。将他们合并到同一个集合中(我们可以把与 0 连通的集合称为“知情组”)。

第二步:分组循环(处理同一时间的会议)

这是算法最精彩的部分。它处理了同一时刻秘密的瞬间传播。

int m = meetings.size();
for (int i = 0; i < m;) {int start = i;int time = meetings[i][2];// 1. 合并在同一时间发生的会议 (乐观合并)for (; i < m && meetings[i][2] == time; i++) {uf.merge(meetings[i][0], meetings[i][1]);}// 2. 检查并撤销无效合并 (断开未连通 0 的人)for (int j = start; j < i; j++) {int x = meetings[j][0], y = meetings[j][1];if (!uf.is_same(x, 0)) {uf.fa[x] = x; // 孤立 x}if (!uf.is_same(y, 0)) {uf.fa[y] = y; // 孤立 y}}
}

逻辑详解:

  1. 找出同一时刻的所有会议: 内层的 for 循环把所有时间为 time 的会议都找出来。
  2. 全部合并(乐观策略): 在这个时刻,不管谁知道秘密,先把开会的人都连起来。
    • 例如:0知道秘密。会议有 [0, A], [B, C]
    • 合并后:{0, A} 连通,{B, C} 连通。
  3. 撤销(Reset)逻辑 —— 最关键的一步:
    • 遍历刚才合并过的所有人。检查他们现在是否和 0 号连通。
    • 如果在同一个集合(is_same(x, 0) 为真): 说明这个人通过这一批会议,成功链式接触到了秘密源头,他现在的状态是“知情”,保留合并关系。
    • 如果不在同一个集合: 说明这几个人虽然在当前时刻开会了(比如 B 和 C 开会),但他们中没有人知道秘密。
      • 必须把他们重置为孤立状态 (uf.fa[x] = x)
      • 为什么? 因为秘密不会“预知未来”或“穿越回过去”。如果 B 和 C 在 T=5 开会(都不知道秘密),而在 T=10 时 B 遇到了 0 知道了秘密,此时 T=5 的那次会议不能让 C 也知道秘密。如果现在不把 B 和 C 断开,等到 T=10 处理 B 时,C 也会顺带被判定为知情,这是错误的。

第三步:收集结果

vector<int> ans;
for (int i = 0; i < n; i++) {if (uf.is_same(i, 0)) { // 只要和 0 连通,就是知情人ans.push_back(i);}
}
return ans;

最后扫描所有人,只要和 0 号专家在同一个集合,就加入结果列表。


总结

这个算法非常巧妙地解决了“动态连通性”的一个特例:

  1. 时间维度: 通过排序解决。
  2. 空间传播: 通过并查集解决。
  3. 状态隔离: 通过“同一时间批处理 -> 检查连通性 -> 只有未连通源头的重置”这一策略,避免了错误的秘密传播,同时保证了同一时刻的秘密能瞬间传遍整个连通分量。

复杂度分析:

  • 时间复杂度: $O(M \log M + M \alpha(N))$。主要是排序的开销,并查集的操作接近常数。
  • 空间复杂度: $O(N)$,用于并查集数组。
http://www.jsqmd.com/news/112183/

相关文章:

  • 机台设备数据采集方法的全面解析与应用实践
  • 手机防止丢失方案
  • 2025年12月多功能角度头,角度头,万向角度头公司推荐:行业测评与选择指南 - 品牌鉴赏师
  • 全屋定制环保材料公司哪家强?2025年最新市场格局分析与五大核心品牌实力推荐 - 品牌推荐
  • 探寻优质蓝牙音箱喇叭:泰声源电子脱颖而出 - mypinpai
  • 安全隔离网闸厂家怎么选?聚焦核心指标,筑牢网络边界安全防线
  • 2025 最新!公众号助手实用技巧大揭秘—有一云 AI 亲测脱颖而出
  • 无人机与低空经济的发展 - 实践
  • 2025深圳旧房改造公司权威推荐榜单 - 品牌评测官
  • 2025年平层全屋定制公司TOP5推荐榜:基于市场格局与交付实力深度解析,这五家值得重点考察 - 品牌推荐
  • 苏州固函封口机:14年自动化设备制造商解决方案 - 资讯焦点
  • 使用 ZABBIX 6.0 监控 MySQL 主从复制架构状态
  • 蓝牙音箱喇叭怎么选?这些要点和品牌别错过 - mypinpai
  • 2025年8项舆情预警平台服务商关键能力解析及优选建议 - 深度智识库
  • 2025年怎样选优质橡胶板厂家?靠谱专业橡胶板厂家推荐 - 工业品牌热点
  • 2025年怎样选优质橡胶板厂家?靠谱专业橡胶板厂家推荐 - 工业品牌热点
  • 评估高级AI的潜在网络安全威胁
  • 2025年资深家居产业观察家推荐:当前最值得关注的5家平层全屋定制公司研究报告 - 品牌推荐
  • 2025 年 12 月制氮机厂家权威推荐榜:PSA制氮机装置,模组制氮机,氨气净化干燥装置,高效节能稳定供气系统深度解析 - 品牌企业推荐师(官方)
  • 2025年资深行业分析师推荐:当前最值得关注的5大全屋定制环保材料供应商深度横评 - 品牌推荐
  • 警惕存储型XSS漏洞:Gal Dubinski Stars Testimonials插件安全风险剖析
  • 基于MATLAB的音频信号AM调制与解调实现
  • 2025年度靠谱隔热条生产商推荐:隔热条生产厂家哪家好? - 工业推荐榜
  • 2025年值得推荐的数控旋风铣供应商排行榜,精选数控旋风铣推荐厂家 - myqiye
  • 2025年Starlink星链配件源头供应商推荐:加工厂哪家更值得选? - 工业品牌热点
  • 腾讯企业邮箱经销商新规出台,这些变化你必须知道! - 品牌2026
  • 跨网文件传输用哪个产品?Ftrans Ferry的核心功能是什么?
  • PN7642怎么获取ATQA和SAK
  • 2025年北京整装局改口碑排行榜:优选世家整装局改行业口碑排名如何 - 工业推荐榜
  • 2025年12月遵义路缘石,都匀路缘石,路缘石公司推荐:行业测评与选择指南 - 品牌鉴赏师