题解 | #素数伴侣#

素数伴侣

https://www.nowcoder.com/practice/b9eae162e02f4f928eac37d7699b352e?tpId=37&tags=&title=&difficulty=0&judgeStatus=0&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37

# 判断素数
def is_prime(n):
    m = int(n ** 0.5) + 2
    for i in range(3, m, 2):
        if n % i == 0:
            return False
    return True
def find_prime_pairs(n, nums):
    
    #分为奇数和偶数两个列表,素数比为奇数和偶数的和
    odds = [num for num in nums if num % 2 == 1]
    evens = [num for num in nums if num % 2 == 0]
    
    # 构建图的邻接表
    adj = {odd: [] for odd in odds}
    for odd in odds:
        for even in evens:
            if is_prime(odd + even):
                adj[odd].append(even)
    
    # 匈牙利算法寻找最大匹配
    def bpm(u, match, visited):
        for v in adj[u]: #v为可以与当前奇数组成素数的偶数
            if not visited[v]:
                visited[v] = True #如果当前偶数已经配对但还与当前奇数匹配,visited[v]用来控制先前配对的奇数看其他节点
                if v not in match or bpm(match[v], match, visited): #如果当前偶数没有配对则直接配对成功;如果当前偶数已经被分配,再找之前与之匹配的奇数还有没有其他偶数可以配对的,如果有就更改一下配对,当前奇数和之前的奇数都会匹配成功,此时visited会产生作用,相当于回溯重新分配
                    match[v] = u
                    return True
        return False
    match = {} #记录匹配关系
    result = 0
    for odd in odds:#为每个奇数分配偶数,如果成功+1
        visited = {even: False for even in evens}
        if bpm(odd, match, visited):
            result += 1
    return result
n = int(input())
val = list(map(int, input().split(" ")))
result = find_prime_pairs(n, val)
print(result)









全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务