华为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 算法,这是一个经典的用于查找图中所有极大团的回溯算法。

关键数据结构:

  1. 邻接矩阵(adj[][]):表示朋友关系图,adj[i][j] = true 表示 i 和 j 是朋友
  2. 名称到ID的映射(nameToId):将字符串名称映射为整数ID,便于使用邻接矩阵
  3. 三个集合
    • R:当前已加入团的节点集合
    • P:可能加入团的候选节点集合
    • X:已经处理过、不应再加入的节点集合

算法流程:

  1. 构建图

    • 读取输入的朋友关系
    • 为每个出现的名字分配一个唯一ID
    • 在邻接矩阵中建立无向边关系
  2. 执行Bron-Kerbosch算法

    void bronKerbosch(List<Integer> R, List<Integer> P, List<Integer> X)
    
    • 递归寻找所有极大团
    • 初始时,R为空,P包含所有节点,X为空
    • 当P和X都为空时,R就是一个极大团,如果其大小≥3,则计数加1
  3. 优化点

    • 使用pivot优化减少递归分支
    • 只遍历P中"非pivot邻居"的节点,避免重复查找
posted @ 2026-03-14 19:19  华为od算法大师  阅读(1)  评论(0)    收藏  举报