28 素數伴侶(匈牙利演算法)

2021-09-07 20:28:12 字數 2139 閱讀 4364

題目描述

題目描述

若兩個正整數的和為素數,則這兩個正整數稱之為「素數伴侶」,如2和5、6和13,它們能應用於通訊加密。現在密碼學會請你設計乙個程式,從已有的n(n為偶數)個正整數中挑選出若干對組成「素數伴侶」,挑選方案多種多樣,例如有4個正整數:2,5,6,13,如果將5和6分為一組中只能得到一組「素數伴侶」,而將2和5、6和13編組將得到兩組「素數伴侶」,能組成「素數伴侶」最多的方案稱為「最佳方案」,當然密碼學會希望你尋找出「最佳方案」。

輸入:有乙個正偶數n(n≤100),表示待挑選的自然數的個數。後面給出具體的數字,範圍為[2,30000]。

輸出:輸出乙個整數k,表示你求得的「最佳方案」組成「素數伴侶」的對數。

輸入描述:

輸入說明

1 輸入乙個正偶數n

2 輸入n個整數

輸出描述:

求得的「最佳方案」組成「素數伴侶」的對數。

思路:素數,除了2是偶數,其他是奇數——而現在不可能出現2了,所以我們只考慮奇數的素數2個數的和是奇數,有什麼情況呢?只有奇數+偶數。所以,我們把這些數分成2堆——奇數和偶數,然後在他們中間,和是素數的,連上一條邊,然後做匹配。因為對二分圖的最大匹配,有乙個簡單很多的演算法,匈牙利演算法。二分圖就是,你可以把圖上的點分成2堆,每堆之內的點不會有邊,2堆之間,才可能連邊。換句話說,一條邊,必定連2個來自不同堆的點。現在,對每條邊,一定連乙個奇數,乙個偶數,點能按奇數和偶數分成兩部分,剛好就是二分圖嘛!

匈牙利演算法:

import math

def prime_judge(n):

if n>1:

m = int(math.sqrt(n))

if n % 2 == 0:#將2及所有合數因子排除掉

return false

else:

for i in range(m + 1)[3::2]:#從3起步,步長為2

if n % i == 0:

return false

return true

return false

def group_lst(lst): ##分奇偶

odd =

even =

for i in lst:

if int(i) % 2 == 1:

else:

return (odd, even)

def matrix_ab(a, b):

matrix = [[0 for i in range(len(b))] for i in range(len(a))]

for ii, i in enumerate(a):

for jj, j in enumerate(b):

if prime_judge(i + j) == true:#和為素數,則對應索引標為1

matrix[ii][jj] = 1

return matrix

def find(x):#匈牙利演算法從b中為x找匹配

for index, i in enumerate(b):#遍歷b中每個元素

if matrix[x][index] == 1 and used[index] == 0:#如果有素數搭配連線並且無標記(標記的十一時這次曾試圖改變歸屬,但沒有成功)

used[index] = 1

if connect[index] == -1 or find(connect[index]) != 0:#b中元素無連線或能騰出位置

connect[index] = x#為b匹配

return 1

return 0

while true:

try:

n = int(input())

m = input().split()

(a, b) = group_lst(m)

matrix = matrix_ab(a, b)

connect = [-1 for i in range(len(b))]

count = 0

for i in range(len(a)):

used = [0 for j in range(len(b))]

if find(i):

count += 1

print(count)

except:

break

素數伴侶 匈牙利演算法

對於0和1來說,它們既不是素數也不是合數。任何乙個大於1的正整數n,可以且唯一表示成有限個素數的乘積。素數 在乙個大於1的自然數中,除了1和此整數自身以外,不能被其他自然數整除的數。比1大,但不是素數則稱之為合數。匈牙利演算法 增廣路徑的理解 理解一 在二分圖的匹配中,如果一條路徑的首尾是非匹配點,...

華為oj之素數伴侶 匈牙利演算法

題目描述 若兩個正整數的和為素數,則這兩個正整數稱之為 素數伴侶 如2和5 6和13,它們能應用於通訊加密。現在密碼學會請你設計乙個程式,從已有的n n為偶數 個正整數中挑選出若干對組成 素數伴侶 挑選方案多種多樣,例如有4個正整數 2,5,6,13,如果將5和6分為一組中只能得到一組 素數伴侶 而...

華為OJ之素數伴侶 匈牙利演算法

題目描述 若兩個正整數的和為素數,則這兩個正整數稱之為 素數伴侶 如2和5 6和13,它們能應用於通訊加密。現在密碼學會請你設計乙個程式,從已有的n n為偶數 個正整數中挑選出若干對組成 素數伴侶 挑選方案多種多樣,例如有4個正整數 2,5,6,13,如果將5和6分為一組中只能得到一組 素數伴侶 而...