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