题目描述
来源
OpenJudge网站 —— 百练习题集-第4109号习题
要求
总时间限制: 3000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述
小明和小红去参加party。会场中总共有n个人,这些人中有的是朋友关系,有的则相互不认识。朋友关系是相互的,即如果A是B的朋友,那么B也是A的朋友。小明和小红想知道其中某两个人有多少个公共的朋友。
输入
第一行为一个正整数c,代表测试数据的个数。接下来是c组测试数据。
对于每组测试数据,第一行是三个数字n(2<=n<=100),m和k,分别表示会场中的人数,已知的朋友关系数目,问题的数目。接下来的m行,每行用两个数字i和j(1<=i,j<=n)表示了一个朋友关系,表示第i个人和第j个人是朋友关系。接下来的k行,每行用两个数字i和j(1<=i,j<=n)表示一个问题,请问第i个人和第j个人有多少公共的朋友。
输出
对于第i组测试数据,首先输出一行”Case i:”,接下来得k行代表了k个问题,每行输出第i个人和第j个人有多少公共的朋友。
样例输入
2
3 2 2
1 2
2 3
1 3
1 2
5 5 2
1 2
1 3
2 5
3 5
4 5
1 5
3 4
样例输出
Case 1:
1
0
Case 2:
2
1
解题思路
- 对于n个人,统计每个人的朋友。
- 要找第i个人和第j个人的公共朋友,就是求集合的交集。
- 求出交集的元素个数,即为结果。
- Python语言的set类型适合用来存储第i个人的朋友,会自动去重,而且求交集很方便。
参考答案
c = int(input())
for t in range(c):
n, m, k = [int(s) for s in input().split()]
friends = []
for i in range(n+1):
friends.append(set())
# print(len(friends))
# print(type(friends[1]), type(friends[2]))
for d in range(m):
l, r = [int(s) for s in input().split()]
friends[l].add(r)
friends[r].add(l)
print("Case %d:"%(t+1))
for p in range(k):
l, r = [int(s) for s in input().split()]
# print("l:", print(friends[l]))
# print("r:", print(friends[r]))
print(len(friends[l].intersection(friends[r])))
测试用例
-
题目描述给出的测试用例覆盖了没有公共朋友、1个公共朋友和多个公共朋友的情形。
-
1组测试用例。n=2。
样例输入
1
2 2 1
1 2
2 1
1 2
样例输出
0 -
全部互为朋友。
样例输入
1
4 6 1
1 2
1 3
1 4
2 3
2 4
3 4
1 4
样例输出
2
小结
- Python语言的set类型适合用来存储集合,执行集合操作方便快捷。
- 求集合的交集是本题使用的算法的核心。

本文解析了OpenJudge网站上的第4109号习题,介绍了解决公共朋友问题的算法思路,使用Python的set类型高效求解集合的交集,适用于竞赛编程和算法学习。
——OpenJudge百练习题:公共朋友&spm=1001.2101.3001.5002&articleId=104891446&d=1&t=3&u=1294fa609c854ea496d4632383e55626)
3794

被折叠的 条评论
为什么被折叠?



