二部グラフ・マッチングアルゴリズムHKハンガリー -

二部グラフのみ環が存在しない場合場合、奇数の数字の長さ

上記定理2部グラフ着色決意、O(N + M)の複雑

1つの 空隙 DFS(int型のx、int型の色){
 2      V [X] = 色。
3      用のint型 I =ヘッド[X]; I; I = NEX [I]){
 4          int型の Y = 版[I];
5          もし(!V [Y]){ 場合(!DFS(Y、3 -カラー))を返し ;}
 6          他の 場合(V [Y] ==色)を返す 7      }
 8      リターン 9  }
 10  
11  int型のmain(){
12      ブールフラグ= 13      のためにint型 i = 1 ; iが<= N iが++)場合(V [I]!)であれば(DFS(I、!1フラグ=))はfalse 14 }

二部グラフマッチングアルゴリズムについて、最も基本的にはハンガリーのアルゴリズムはOの複雑さの増加に一致する、彼は道を増強しているかどうかを確認するために、その都度ポイントを見つけるために、である(N * M)

1  BOOL DFS(INT X){
 2      ためのint型 I =ヘッド[X]; I; I = NEX [I]){
 3          int型、Y = 版[I];
4          もし(!V [Y]){
 5              V [Y] = 1 6              もし(!M [Y] || DFS(M [Y])){
 7                  M [Y] =のX。
8                  返す 9              }
 10          }
 11      }
 12  }
 13  のためにINT I = 1; iが<= N; iは++ ){
 14      のmemsetを(V、0はsizeof (V))。
15      であれば(DFS(I))は++ ANS 16 }

HKアルゴリズムの複雑さは、各々が√Nと一致、(Nドットによる一致最悪の場合にそれがもはや使用N倍になるように、M個のマッチポイントの各々と一致しないが、唯一の√N倍であります√N倍に一致する、各一致が一致に基づいて一致するように1×N Mは一度だけ必要がある場合、それは、唯一√NそれぞれのM *とは、複雑さを√Nし、マッチの最後の数を超えることはできません最悪の場合、Mは反復回数が√N最悪であるように、又はN * 1)は、Mであります

1  BOOLの検索(INT X){
 2      / * 右の深さまでのすべての左側の検索+1点であり、これは、拡張増強パスかどうかを確認するために、パスを増強を探しに相当する* / 
3。     ためのint型私は= 0 ;私はGを<[X] .size();私は++ ){
 4。         INT Y = G [X] [I]、
 5          IF!(VIS [Y] && Dyを[Y] == DX [X] + 。1 ){
 。6              VIS [Y] = trueに7              IF {MX [X] = Y;私[Y]はXの=(!私[Y] ||)(マイ[Y]を見つける。)リターン trueに;}
 。8          }
 。9      }
 10      リターン ;
 11 }
 12  
13  int型の一致(){
 14      / * 初始化* / 
15      のmemset(MX、0はsizeof (MX))。
16      のmemset(私の、0はsizeof (私の));
17      INT ANS = 0 18      一方){
 19          / * 初始化* / 
20          ブールフラグ= 21          一方(q.size())q.pop();                      
22          のmemset(DX、0はsizeof(DX))は、
 23である          のmemset(Dyを、0はsizeof (のDy));
 24          / * 全てのキューに不一致点を左* / 
25          フォア(I、1)、NXをIF!(MX [P [I] ])q.push(P [I]);
 26である         * / 全て非マッチング点BFSは、すべてのタップ層の数* / 
27          ながら(q.size()){
 28              INT X = q.front() ; q.pop();
 29              INT I = 0 ;私はGを<[X] .size();私は++ ){
 30                  INT Y = G [X] [I]、
 31は                 IF(!Dyを[Y]) {
 32                     DY [Y] = DX [X] + 1 ;
 33は、                     / * すべての一致点は層数が一致し続ける* / 
34である                     IF(マイ[Y])DX [マイ[Y] = DY [Y] + 。1 、q.push(マイ[Y]);
 35                      他のフラグに= trueに;
 36                  }
 37              }
 38である         }
 39          IF(フラグに!)BREAK ; // マッチング点のヌル点が存在することを確認し
40          のmemset(VIS、0はsizeofは(VIS));
 41は、          フォア(I、1、NX)IF!(MX [P [I]] &&検索(P [I]))ANS ++;
42      }
 43      リターン年。
44 }
1つのベクトル< INT > G [N]。
2  int型NX、NY;
3  int型のMX [N]、私[N];
4キュー< 整数 > Q;
5  int型DX [N]、DYの【のN]。
6  BOOL VIS [N]。

 

おすすめ

転載: www.cnblogs.com/rign/p/11116871.html