华为OD机考双机位C卷 - 朋友圈个数 (Java & Python & JS & GO & C++ & C)
朋友圈个数
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
给定一组朋友关系,统计一下该朋友关系网中的朋友圈个数 朋友圈的定义:一个朋友圈至少由3个朋友组成,且要求同一个朋友圈中的任意两个人都具有直接的朋友关系。
输入描述
输入一个朋友关系列表,如 Friends = [[A,B], [A,C], [B,D]],其中的每一个元素 Friends[i] 表示 Friends[i][0] 和 Friends[i][1] 是朋友关系 先输入一个数字 N 代表关系的总数,后面每条关系一行,两个成员以逗号分隔.
输出描述
输出一个整数,表示整个关系网中朋友圈的个数
补充
-
Friends.length >= 1,Friends.length <= 10^3
-
输入的总朋友个数 <= 100
-
输入保证
Friend[i][0] 和 Friend[i][1] 一定不一样,且同一关系不会反向输入,即不会同时输入 [A,B] 和 [B,A] -
不考虑子朋友圈,即当发现 [A,B,C,D] 组成一个朋友圈时,[A,B,C]、[A,B,D] 等子朋友圈不单独计数
示例1
输入
3
A,B
A,C
B,D
输出
0
说明
示例2
输入
7
A,B
A,C
B,C
A,D
D,E
B,D
A,E
输出
3
说明
存在3个朋友圈 [A,B,C]、[A,D,E]、[A,B,D]
示例3
输入
6
A,B
A,C
B,C
A,D
B,D
D,C
输出
1
说明
解题思路
这道题本质上是在求解极大团(maximal clique)的数量,其中每个极大团至少包含3个节点。在图论中,团(clique)是一个完全子图,即子图中的任意两个顶点之间都有边相连。
核心解题方法:Bron-Kerbosch 算法
代码使用的是 Bron-Kerbosch 算法,这是一个经典的用于查找图中所有极大团的回溯算法。
关键数据结构:
- 邻接矩阵(adj[][]):表示朋友关系图,
adj[i][j] = true表示 i 和 j 是朋友 - 名称到ID的映射(nameToId):将字符串名称映射为整数ID,便于使用邻接矩阵
- 三个集合:
- R:当前已加入团的节点集合
- P:可能加入团的候选节点集合
- X:已经处理过、不应再加入的节点集合
算法流程:
-
构建图:
- 读取输入的朋友关系
- 为每个出现的名字分配一个唯一ID
- 在邻接矩阵中建立无向边关系
-
执行Bron-Kerbosch算法:
void bronKerbosch(List<Integer> R, List<Integer> P, List<Integer> X)- 递归寻找所有极大团
- 初始时,R为空,P包含所有节点,X为空
- 当P和X都为空时,R就是一个极大团,如果其大小≥3,则计数加1
-
优化点:
- 使用pivot优化减少递归分支
- 只遍历P中"非pivot邻居"的节点,避免重复查找
浙公网安备 33010602011771号