タイトル説明
両方の正の整数とが素数である場合、暗号化通信に適用可能な2と5、6及び13のような「プライムパートナー」と呼ばれる2つの正の整数、、。2,5:4つの正の整数があるので今、あなたは、既存のNからプログラムを設計することを学ぶパスワード(Nは偶数である)正の整数は、いくつかのペアプライムパートナー」、多様ななどのプログラムの選択を選びます6,13、5,6、2、5,6及び13は、二つの「プライムパートナー」を取得成る「プライムパートナー」で構成することができる最もながらグループにのみ、「プライムパートナー」のセットに入る場合プログラムはもちろん、あなたがパスワードを学ぶ知りたい、「最良の解決策」と呼ばれる「ベストプラクティスを。」
エントリー
正の偶数N(N≤100)があり、選択される自然数の数を示します。具体的な数値は範囲[2,30000]で、後記。
輸出
出力アン整数K、あなたが数の「プライムパートナー」からなる「ベストソリューション」を得ていること。
説明を入力します。
図1に示すように、入力の正の偶数N
2、nは整数入力
出力説明
「ベストプラクティス」の構成要素「プライムパートナー」の決められた数。
エントリー
4
2 5 6 13
輸出
2
思考
関連概念
二部グラフ
二部グラフは、すべての点が2つのグループに分けることができるグラフで実際に、同じグループには縁部を有していない、すべての側面が2つのグループを超えています。正確:グラフの頂点は、各辺がそれぞれ、U、頂点Vに接続されている2つの互いに素の集合UとVに分け、そしてそのようなされている場合、この分割の存在下、図この呼ばれる二部グラフ。
加えて、二部グラフと等価な定義があるがある:「環含有奇数側」は、図には含まれていません
マッチング
部グラフマッチングする任意の双方が共通の頂点ではない辺の集合です。我々は定義する:
マッチングエッジ、マッチポイント、非エッジマッチング、非マッチングポイント。
図は:、1-2リンク5-4接続されている場合は、7-6に接続されています。明らか側縁7-6、1,2,4,5,6,7-マッチング点と一致するように、1-2、5-4側縁。残りの非マッチングおよび非マッチングエッジ点。
最大マッチング
このマッチングの一致のためのアップ、すなわち図におけるエッジの最大数は、図に含まれているものと一致します。図のような最大マッチングであります:
これまでで最大の試合は一つだけではないかもしれません。
完璧にマッチ
グラフ、すべての頂点がマッチポイントであればマッチが、それは完璧にマッチです。図は、完璧にマッチです。もちろん、完全な一致は、(完璧にマッチポイントが一致したのいずれか、新しいマッチング側は既存の一致する側と競合する追加)最大の一致でなければなりません。しかし、すべて完璧に一致しているマップではありません。
代替ルート
の出発点からの一致しない、代替パスと呼ばれる形成された非エッジマッチング、エッジマッチング、非エッジマッチングパス......通過します。代替経路は図2-> 1-> 8> 7。
経路を増強
、この代替パスを増強経路(agumentingパス)と呼ばれる別のマッチポイントに達していない場合はポイントからは一致しない、代替ルートを取ります。図1-> 2-> 3-> 6> 7>図8は、経路を増強するものです。
増強路特性
3つの結論を次のパスを増強することによって定義されるが、(電流経路P、現在のMのマッチングを提供)を導入することができる:
1、Pは、経路長が奇数、第1の側縁と最後でなければならないです両端点の集合は、2つに属し、そして一致しないようにMが属します。
2、Pは、より大きなM「と一致するように、逆の操作を介して取得することができます。
経路に対して増強場合のみMが存在しない場合は3、MはGの最大マッチングです。
ハンガリーアルゴリズム:最大マッチング増強経路シーク
1は、Mは、nullに設定されています。
パス2つの操作までにより広い見つからなくなるまで2は、増強パスP、大きなマッチM「の代わりに、M 3を否定することによって操作を見つけるために、繰り返されます。
パスアルゴリズムを増強探し
我々は(vは頂点Yでなければならない)非隣接アクセスポイントVのために1つの比類のない頂点のu、見て、増強パスを見つけるX部から始まるのDFSメソッドを使用します。Vのために、二つの可能性:
1、一致しない場合、vは、増強パスを発見しました。
vが有する場合2、マッチングが"反転"のアイデアによれば、(Xが尖なければならないw)は頂点v W、現在のマッチである(V、W)のエッジを取られるに(W V)修飾比類のない、(u、v)は、これを達成するための条件と一致するように設定されていることを見ているかどうかを増強パスP」を見つけるwはから新たな出発点。OKならば、UV-Pは「U起源の拡張のためのパスです。
コードは以下の通りです
1つの#include <iostreamの> 2の#include <CStringの> 3。の#include <ベクトル> 4。 使用した 名前空間STD; 5 CONST INT N = 100、M = 60001 ; 6ベクトル< INT > G [N]; // 二部図 7。 INT事前[N]、NUMS [N]; // 偶奇マッチング点に対応する電流、入力の数 8。 BOOLフラグにisPrime [M]、[N]; // 素数対応テーブルか、マッチングポイントを一致させることができる 9 @オイラーふるいテーブル素数の確立対応テーブル 10 ボイドprimeTab(){ 11 のintプライム[M]、CNT =0 ; 12 プライム[CNT ++] = 2 ; 13 のmemset(isPrime、真、はsizeof (isPrime))。 14 isPrime [ 0 ] = isPrime [ 1 ] = 偽。 15 のために(INT iは= 4 ; I <M、I + = 2 ) 16 isPrime [I] = 偽。 17 のために(INT iは= 3 ; I <M、I + = 2 ){ 18 であれば(isPrime [i])と 19 プライム[CNT ++] = I; 20である ため(INT J = 0 ; J <CNT && I *プライム[J] <M; ++ J){ 21は isPrime [I *プライム[J] = falseに、 22は、 IF(Iプライム%[J]は== 0 ) 23である BREAK ; 24 } 25 } 26れる } 27 // 、経路を増強深さ優先探索最大マッチングを見つける 28 BOOL DFS(INT {N-) 29 のために(INT I = 0 ; I < G [N-] .size(); ++ I){ 30 INTは X = G [N-] [I]; 31である IF(のフラグ[X]) // NUMS場合、[X] NUMS [n]の一致点が、今するために必要とされている 32が 続行; 33は 、フラグ[X ] = trueに ; // NUMS [X]マッチング点のNUMS [N]となる 34である // NUMS [X] [|| NUMSと一致しないX]は一致したが、新たなマッチング点テンようにマッチングポイントを探すために許容され得ますNUMSアウト[X] 35 IF(PRE [X] == - 1。 || DFS(予備[X])){ 36 プレ[X] = N-; // NUMSに[n]はNUMS [X]と一致する 37 [ リターン trueに、 38である } 39 } 40 リターン falseに、 41である } 42であり、 INT (メイン){ 43は、 INT N-、 44は primeTab(); // ビルド素数対応テーブル 45 / * 46れる プレNUMSが奇数に格納されているので、予め、-1にデフォルトではなく、0で割り当てられて添字。 47 デフォルトでは、フー0プレ[I] 0を事前場合二つの意味=有する: 48 (1)事前に[I]なしにマップ;(2)マッピングプレ[I] NUMS [0]。 49 矛盾したが、それが割り当てられている-1。 50 * / 51である (前-のmemset 。1、はsizeof (PRE)); 52は 、一方(CIN >> N-){ 53である ため(INT I = 0、I <N - 、++I) 54が CIN >> NUMS [I]; 55 用(INT I = 0、I <N - 1。 ; ++ I) 56がある ため(INT J = I + 1、J <N-; ++ J) 57である IF( isPrime [I] + NUMS )NUMS [J] 58 NUMS [I]&1。 G [I] .push_back(J):G [J] .push_back(I);? // 構築部グラフリスト法、奇数マッチング点はリンクの偶数であってもよい 59 INT ANS = 0 ; 60 用(INT J = 0 ; J <N-; ++J){ 61である (内のフラグ、memsetをfalseに、はsizeof (のフラグ)); 62は、 IF (DFS(J)) 63である ++ ANS; 64 } 65 COUT ANS << << ENDL、 66 のために(INT I = 0 ; I < N-; I ++){ // クリア二部グラフのマッピング関係 67 G [I] .clear(); 68 } 69 のmemset(前- 1、はsizeof(PRE)); // 偶奇マッチング点に対応するクリア現在 70 } 71 }