我已经考虑了很多天了,我似乎无法找到b)的任何答案。 就像这个家伙一样:
约翰尼已经采取了一个非常重要的课程,并希望他的很多 朋友通过在Facebook上发帖来了解他的成功(//是的 愚蠢我知道)Johnny知道N个用户用1到1的数字表示 N.他们之间有友谊,形式为i,j在哪里我和 j是用户; n,m!= 0.用户不能与自己和朋友成为朋友 友谊告诉我们每个用户都是另一个用户的朋友。 约翰尼想要找出他中最“联系”的人 朋友列表,以便他的帖子将很好地传播到脸书Facebook。对于 对此,Johnny必须找出最大的知名用户子集。 在该子集中,每个用户至少有k个朋友,也是 存在于子集中(k!= 0)。输入:N,m和k在同一行, 由单个空格分隔,也是一个2 * m自然数的序列 (可以在区间[1,N]输出中找到(标准:a) 每个用户的朋友数量从1到N的顺序b)成员 最大的用户子集,拥有每个用户的属性 这个集合至少有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
任何帮助将不胜感激。此外,抱歉笨重的内容,它必须大致翻译。 :)
很多
答案 0 :(得分:2)
该问题要求您计算具有m个边的N节点图的k-core。有一个简单的算法:虽然最低度顶点的度数小于k,但删除它。其余顶点是所需的子集。使用bucket queue保持节点按度数排序,以便有效运行。
第二个想法,我们只需要跟踪(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)