最大2部グラフマッチング(ハンガリー法):素数コンパニオン

タイトル説明

  両方の正の整数とが素数である場合、暗号化通信に適用可能な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

思考

  タイトルモデリングを与えるためにグラフ理論の方法を使用することを検討してください。点の数として100 100、もしこれら二つの数字と共に中間の偶数の両側に、素数です。その後、我々は多くのエッジとして選択したい、これらのエッジを共有エンドポイントに必要とされていません。各番号は、範囲[2,30000]です。2は現在不可能なので、我々は唯一の奇素数を考える-素数2に加えて、他の奇数、偶数です。2と番号が奇数で、+偶数のみ奇数。奇数と偶数、二部グラフを与えるために-したがって、我々は原子炉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 }

おすすめ

転載: www.cnblogs.com/xiehuazhen/p/12574797.html