拘泥于处理(数学)集合和子集的练习

Stuck on exercise dealing with (mathematical) sets and sub-sets

本文关键字:子集 练习 集合 数学 处理 于处理      更新时间:2023-10-16

我已经考虑了好几天了,似乎真的找不到b)的任何答案。就像这样,伙计们:

Johnny上了一门非常重要的课程,他想要很多朋友们通过在Facebook上发帖了解他的成功(//是愚蠢的我知道)Johnny知道N个用户,用从1到N.他们之间有m个友谊,形式为i,j,其中i和j是用户;n、 m!=0。用户不能与自己和友谊告诉每个用户都是另一个用户的朋友。Johnny想知道他的团队中哪些人最"有联系"朋友列表,这样他的帖子将在脸书上广泛传播。对于这,强尼不得不找出最大的一个子集知名用户。在这个子集中,每个用户至少有k个朋友,他们也是存在于子集(k!=0)中。输入:N、m和k在同一行,由单个空间分隔,也是2*m个自然数的序列(可以在区间[1,N]输出中找到(标准:a)每个用户的好友数量(从1到N)的成员最大的用户子集,具有每个用户所在的属性这一组至少有k个朋友(同样,可以在特定子集)。如果给定k没有这样的子集,则打印"否">

对于这个问题,你不能使用任何专门的库,所以我被卡住了符合标准。

同样,这是关于集合的数学概念,而不是C++专用集合、多集合等库。

a) 很容易,但正如我所说,b)给我带来了一些麻烦。

Examples: 1)
Input: 5 5 
2 1 2 5 1 3 2 4 5 1 4 
Output:
a) 3 2 1 2 2    b) 1 4 5

2) Input:
5 5 3 
1 2 5 1 3 2 4 5 1 4 

Output:
a) 3 2 1 2 2
b) NO
and 3) Input:
11 18 3
1 8 4 7 7 10 11 10 2 1 2 3 8 9 8 3 9 3 9 2 5 6 5 11 1 4 10 6 7 6 2 8 11 7 11 6 
Output:
a) 3 4 3 2 2 4 4 4 3 3 4
b) 2 3 6 7 8 9 10 11

如有任何帮助,我们将不胜感激。此外,很抱歉内容过于庞大,必须粗略翻译。:)

有很多

这个问题需要计算具有m条边的N节点图的k核。有一个简单的算法:当最低阶的顶点的阶数小于k时,删除它。剩下的顶点就是所需的子集。使用bucket队列来保持节点按程度排序,以实现高效操作。

仔细想想,我们只需要跟踪(1)每个节点的度(2)哪些节点的度小于k。在未测试的Python:中

import collections
def kcore(edges, k):
neighbors = collections.defaultdict(set)
for u, v in edges:
neighbors[u].add(v)
neighbors[v].add(u)
bad = {u for (u, neigh) in neighbors.items() if len(neigh) < k}
while bad:
u = bad.pop()
for v in neighbors[u]:
neighbors[v].remove(u)
if len(neighbors[v]) < k:
bad.add(v)
del neighbors[u]
return set(neighbors)