Task 3 Connections FIT 1008

Cs, Go!

||最后更新: 2025-8-25|

3.1 - Initialisation

1️⃣
#有难度
查看思路
整个Task 3 最难的就在初始化的地方,强烈推荐大家先去把后面的题目读完以后再来写初始化。

初始化要求

从我的算法中,初始化需要我们完成一下几步。
  • 让 user name 对应一个 key
  • 记录每个user 关注的人的key
  • 记录每个user 关注的人的name
  • 记录每个关注user的人的key
  • 让 User 的 key 可以对应上 上述的内容。
 
举例
点击展开

举例

假设有三个用户:
  • Alice
  • Bob
  • Charlie
关注关系:
  • Alice 关注了 Bob 和 Charlie
  • Bob 关注了 Alice
  • Charlie 没有关注任何人

用字典表示

数据结构

两个key 推荐使用BitVectorSet → 速度快 → 方便3.2 3.3的操作
关注的name 则推荐使用LinkList → 允许头插 → 方便3.3的操作

3.2 - Mutual Friends

1️⃣
#简单理解
查看思路
在完成上述初始化以后,想要找到 mutual friends 就非常容易了。
给定 人物A人物B
我们需要检查人物A关注被关注是否同时存在人物B的key
BitVectorSet 可以查询

3.3 - AI Clusters

1️⃣
#有难度
查看思路

执行过程逐步解释

  1. 准备两个容器
      • 一个用来记录哪些用户已经被处理过(相当于“标记”用户,避免重复计算)。
      • 一个用来保存所有形成的簇。
  1. 遍历所有用户
      • 从第一个用户开始,一直到最后一个用户。
      • 每次都会计算出当前用户的“用户 key”。
  1. 检查是否跳过这个用户
      • 如果这个用户已经被处理过(出现在用户记录集合里),就直接跳过。
      • 如果这个用户的关注和粉丝之间有差集(说明不是AI),也会跳过。
  1. 如果不跳过,就把这个用户加入某个簇
      • 先把该用户的“关注集合”加入到用户记录集合(表示这些人已经被处理过)。
      • 然后新建一个簇,把这个用户以及相关的信息放进去。
      • 最后把这个簇保存到簇的列表里。
  1. 最后输出结果
      • 打印出最终形成的簇列表。
2️⃣
#有难度 FIT054
🔺注意:为了时间复杂度的降低,为代码和解题思路会在周一周二更新。不会有大的变动。
查看思路
理解题意:

📖 题目理解

  • 平台 TipTop 想要检测 AI 群集 (AI Clusters)
  • AI Cluster 定义
      1. 一组用户之间 全部互为好友(即形成一个完全图 / clique)。
      1. 该组用户 没有与外部用户的连接
  • 特殊情况:
    • 没有任何朋友的用户(孤立节点)也算作一个大小为 1 的 AI cluster。

🚀 思路概要

  1. 遍历所有用户 → 用 BFS/队列 找到他们所在的连通分量。
  1. 检查连通分量是否是完全图 → 即每个用户的好友数应为 (该分量大小 - 1)。
  1. 检查是否无外部连接 → 所有好友必须在这个分量里。
  1. 保留符合条件的分量,作为一个 AI cluster。

🔎 核心步骤

1. 使用 BFS 找连通分量

  • 初始化:一个全局 visited 集合,记录已访问的用户。
  • 遍历所有用户:
    • 如果该用户未访问过 → 以此用户为起点,做 BFS。
    • BFS 用队列扩展,找到所有与其相连的用户,形成一个 子集(连通分量)
👉 得到的子集是图中的一个 connected component

2. 判断连通分量是否是 AI cluster

对于 BFS 得到的每个连通分量:
  • 完全互连条件
    • 如果子集大小 = k,
    • 则子集中的每个用户的好友数必须是 (k - 1)。
  • 无外部连接条件
    • 取每个用户的好友列表,必须全部包含在该子集里。
只有满足这两个条件,这个子集才是 AI cluster

3. 特殊情况处理

  • 如果用户完全没有好友:
    • BFS 得到的子集大小 = 1。
    • 按定义,这也是一个 cluster。

🛠️ 数据结构选择

  • 队列 (queue) → BFS 遍历
  • 集合 (set / BitVectorSet) → 存储已访问节点
  • 集合 (ArraySet/BitVectorSet) → 存储每个 cluster
作业要求说明:内部结构不限,可以是数组的数组、链表的链表等,不影响分数。

📊 示例解析

示例 1

用户: [A, B, C, G, H, K]
  • A ↔ B, B ↔ C, A ↔ C
  • G ↔ H
  • K 无好友
结果:

示例 2

用户: [A, B, C, D, E]
  • A ↔ B
  • C ↔ E (但不是互为好友,因为 E 没有指向 C) → 不算 cluster
  • D 孤立
结果:

⚡ 时间复杂度分析(非评分点,仅理解)

  • BFS:每个用户最多被访问一次 → O(n + m),n=用户数,m=边数
  • 检查完全图:每个连通分量 O(k²),但一般较小
  • 总体上可接受,题目说明只要能在大输入下快速完成即可。

✅ 最终总结

  • 用 BFS 找到连通分量
  • 判断是否为完全图(所有人互为好友)
  • 判断无外部连接
  • 孤立用户也算 AI cluster
  • 输出所有符合条件的子集
大致思路
  1. BFS 分组
      • 用位掩码 + 队列做广度优先搜索,找到每一个 连通分量,存进 AI_clusters
  1. 去重
      • 如果两个集合有交集(共享节点),则丢弃。
  1. 筛选“完整团”
      • 检查每个集合是否是一个 完全图(clique)
        • 即集合内每个节点都应该连接到集合里其他所有节点。
        • 如果不是,就移除该集合。
难点在于降低时间复杂度。
 
伪代码
Loading...