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

素数伴侣

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)

全部评论

相关推荐

点赞 评论 收藏
分享
09-27 00:29
东北大学 Java
伟大的麻辣烫:查看图片
阿里巴巴稳定性 77人发布 投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务