[テンプレート]二部グラフの最大マッチングアルゴリズムとハンガリー

1  BOOL DFSは(INT U)
 2  {
 3。     ための(I = iterator_t G [U] .begin();! G = I [U] .END();私は++){ // Uの各隣接点
4          int型 V =エッジ[* I] .TO;
 5          IF([V]チェック!){      // ない交互の経路を主張
6。              チェックは[V] = trueと ; // 置く代替パス
。7              IF(一致[V] == - 1 || DFS([V]に一致する)){
 8。                 // ポイントパスを増強カバー、説明したように、代替経路、スイッチパスではなく、成功を返した場合
9。                  整合[V] = U;
 10                 マッチングは、[U] = V;
 11                  リターン trueに12である             }
 13である         }
 14      }
 15      リターン falseに ; // パスを増強する、故障復帰存在しない
16  }
 17  
18である INT ハンガリー()
 19。 {
 20は     INT ANS = 0 ;
 21である      のmemset(マッチング、 - 1はsizeof (マッチング));
 22である     ためINT U = 0 ; U <num_left; ++ U){
 23は、         IF(一致[U] == - 1 ){
 24              のmemset(空0はsizeofを()チェック)
 25              IF (DFS(U))
 26である                  ++ ANS;
 27          }
 28      }
 29      リターンANS;
 30  }
 31れる // https://www.cnblogs.com/wangjunyan/p/5563154.html 
32  // 隣接行列以下臨界テーブル上記
 33は、 
34である 
35  @ 二部グラフ
36  の#define MAXN 10 //は、XおよびY頂点集合の集合を表します最大数!
37 [   int型 NX、NY; //X頂点の集合数とYの組
38は、  INT、エッジ[MAXN] [MAXN] // エッジ[I] [J] IJを表す一致させることができる
39   INT CX [MAXN]、CY [MAXN]; // とをこれは、レコードセットのx yの要素を合わせて!
40   INTは [MAXN]訪問; // 頂点が訪問されているかどうかを記録するために!
41は  、INT(パスINT U)
 42は 、{
 43は      int型、V
 44である      ため(V = 0 ; V <NY; V ++ 45       {
 46は、          IF(!エッジ[U] [V] && [V]訪問)
 47           {
 48               [訪問しましたV] = 1 ;
 49             IF(CY [V] == - 1つの ||パス(CY [V]))// コレクション内のエレメントv yが一致するか既にマッチVが、CYで見つけることができない場合は[V]増強経路で
50               {
 51は、                   CX [U] = ; V
 52は                   CY [V] = U;
 53である                  リターン 。1 ;
 54である              }
 55           }
 56である      }
 57が      戻り 0 ;
 58  }
 59   INT maxmatch()
 60  {
 61が      INT RES = 0 62である       のmemset( CX、0xffではsizeof(CX))は、// -1の初期値が一致していない要素の二組を意味します!
63である       のmemset(CY、0xFFではsizeof (CY));
 64       のためにINT I = 0 ; I <= NX; I ++ 65       {
 66           IF(CX [I]が== - 1 67           {
 68               のmemset(訪問し、0はsizeof (visitited));
 69の               RES = + パス(I);
 70           }
 71である      }
 72の      リターンRES;
 73である }
 74   //https://www.cnblogs.com/shenben/p/5573788.html

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/11391871.html