🐵指尖猴全新升级
第22课:综合实战:社交网络好友圈
👥

综合实战:社交网络好友圈

好友的好友也是朋友,圈子一数便知!

📖知识引入

🤝关系建模
每个人是点,好友关系是无向边,加边就合并
🧩好友圈=连通块
直接或间接相连的人属于同一个圈,并查集来分圈
🔢数圈方法
fa[i]==i的节点个数,就是好友圈的个数
💬进阶追问
最大的圈有多少人?给每个根挂一个cnt计数器
💡
好友关系是双向的,加一条边合并一次就够,别重复合并同一个圈

🔍好友圈人数统计

#include <iostream>
using namespace std;

int fa[100005], cnt[100005];  // cnt 记录每个圈子的人数

int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }

void unite(int x, int y) {
    int rx = find(x), ry = find(y);
    if (rx == ry) return;      // 已经同圈,别重复合并
    fa[rx] = ry;
    cnt[ry] += cnt[rx];        // 人数累加到新根上
}

// 查询 x 所在圈子的人数:cnt[find(x)]
// 初始化:fa[i]=i 且 cnt[i]=1

合并时把人数累加到新根上,cnt[find(x)]随时查询。

🎯小测验

第1题:好友圈问题的本质是什么?

第2题:统计好友圈个数要数什么?

第3题:查询某人所在圈子的人数应该?

📝本课知识点

  • ✓好友圈=连通块
  • ✓根的个数=圈子数
  • ✓cnt数组记圈子人数
第22课完成!继续探索下一课吧 🚀