题解 | #素数伴侣#给个不一样的解法:建图+贪心

素数伴侣

https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e

将可以组成 素数伴侣 的一对数字 看成 相连的两个节点,建一个无向图,并统计每个节点的

每次从节点中选择 度 最小 的节点,再选择与它相连的 度 最小的节点。之后将他们从图中删除

import math

n = int(input())
nums = list(map(int, input().split()))

def isPrime(x):
    if x == 2:
        return True
    for d in range(2, int(math.sqrt(x))+1):
        if x%d == 0:
            return False
    return True

# 能组成一对素数伴侣的下标,建立成无向图
G = [set() for _ in range(n)]
for i in range(len(nums)):
    for j in range(i+1, len(nums)):
        if isPrime(nums[i]+nums[j]):
            G[i].add(j)
            G[j].add(i)

# 统计节点的度
degrees = [len(G[i]) for i in range(n)]
res = 0
def deleteNode(x):
    # 从图中删除节点
    degrees[x] = 0
    for y in G[x]:
        G[y].discard(x)
        degrees[y] -= 1
    G[x].clear()

while True:

    # 找到度最小的节点
    minn = 1000000000
    x = -1
    for i in range(n):
        if degrees[i] > 0:
            if degrees[i] < minn:
                minn = degrees[i]
                x = i
    if x == -1:
        break
    minn = 1000000000
    y = -1
    
    # 从找到节点的邻接节点中再找一个度最小的节点
    for i in G[x]:
        if degrees[i] > 0:
            if degrees[i] < minn:
                minn = degrees[i]
                y = i
    if y == -1:
        break
    # 删除这两个节点
    deleteNode(x)
    deleteNode(y)
    res += 1
print(res)

全部评论

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务