hdu2063ハンガリーのアルゴリズム二部グラフマッチング問題ソリューション

トピックリンク:http://acm.hdu.edu.cn/showproblem.php?pid=2063

ハンガリー増強パスアルゴリズムは、二部グラフマッチング問題に適用される再帰アルゴリズムに基づいています。この問題は、二部グラフ・アプリケーションの最大マッチングのためにハンガリーのアルゴリズムです。v1の点xに一致するように、yは新しいマッチングオブジェクトはxの公式としてYであってもよいが見出さ上一致しないこの時点ならば、彼の点マッチング対象における電位V2 yに考えられ又は与えることができます試合。

この質問私の使用が隣接行列で、パス時間を増大させる各検索はO(| V | ^ 2)、総時間はOであるので、(| V | ^ 3)、総スペースはO (| Vは| ^ 2)、実装されている場合、次いで隣接リストの合計時間はO(| V || E |)(| E | + | V |)、空間的複雑さはOです。

コードは以下の通りであります:

1の#include <ビット/ STDC ++ H>
 2  使用して 名前空間STDを、
3符号なしのtypedef int型のUI。
4のtypedef 長い LL。
5符号なしのtypedef 長い 長いULL。
6  の#define PFのprintf
 7  の#define MEM(A、B)のmemset(A、B、はsizeof())
 8  の#define prime1 1E9 + 7
 9  の#define prime2 1E9 + 9
 10  の#define PI 3.14159265
 11  の#define LSON Lを、半ば、室温<< 1
 12  の#define rson半ば+ 1、R、RT << 1 | 1
13  の#define scand(X)のscanf( "%のLLF"、&x)は 
 14  の#define F(I、B)のための(INT iは=; I <= B; I ++)
 15  の#defineスキャン()のscanf( "%のD"、&)
 16  の#define MP(a、b)はmake_pair(()、(B))
 17  の#define P対<整数、整数>
 18  の#define DBG(引数)COUT <<#1引数<< ":" <<引数<<てendl;
19  の#define INF 0x7ffffff
 20インラインINT リード(){
 21件     のint ANS = 0、W = 1 22      CHAR CH = GETCHAR()。
23      (!(CH == ' - ')W = - 1 ; CH = GETCHAR();}
 24      ながら(isdigit(CH))ANS =(ANS << 3)+(ANS << 1)+ CH- ' 0 '、 CH = GETCHAR()。
25の     リターン ANSは* wは、
26  }
 27  int型K、N、M。
28  のconst  int型 MAXN = 1E3;
29  INT G [MAXN] [MAXN]。 
30  INT m_girl、n_boy。
31  INT一致[MAXN]、reserve_boy [MAXN]。// 匹配结果在試合中
32  BOOLDFS(INT X)// ハンガリーアルゴリズム:Xは増強パスを探して、すなわち、一致するオブジェクトを見つけるために
33である {
 34である     ためINT I = 1 ; I <= n_boy; I ++ 35      {
 36          IF(reserve_boy [I! ] && G [X] [I])// iと女の子は、xは一致させることができるオブジェクトを保存されていない少年と私
37 [          {
 38は              reserve_boy [I] = 1 ; // 所定の少年私は、X与える準備ができて
39を             IF(一致します! [I] || DFS(マッチ[i])と)
 40              // 2例は、(1)少年私一致するオブジェクト(2)男の子のペアのオブジェクトは、今の少年に私オリジナルのオブジェクトを交換しようとしている両方の成功があります私はX置くために割り当てられた
41のである             {
 42のIS                 一致[I] = X; // i番目のX置換する一対の少年または直接目的に
43である                 リターン trueに44である             } 
 45           } 
 46である     }
 47      リターン falseに ; // iはペアリングの女の子が失敗した
48  }
 49  のint main()の
 50  {
 51である     // ; freopenは( "INPUT.TXT"、 "R&LT"、STDIN)
 52である     // freopenは( "output.txtと"、 "W"、STDOUT); 
53である      :: STD :: IOSのsync_with_stdio(falseに)。
 54は     、一方(scanfの(" %のD "、&​​K)==1 && K)
 55      {
 56          m_girl =(読み取り)、= n_boy (読み取り)
57          MEM(G、0 );
58          MEM(一致、0 ); 
59          INT U、V;
60          F(I、1 、k)の
 61          {
 62              、U =読み取る()、V = )(読み取ります。
63              G [U] [V] = 1// 邻接矩阵存边
64          }
 65          int型の和= 0 66          F(I、1、m_girl)//各女の子のペアを探して、現在は、置換されていてもよいが、正常にペアリングされます後に成功した女の子をシーク
67          {
 68              MEM(reserve_boy、0 ;)
 69              IF(DFS(I))SUM ++ ;
 70          }
 71である          PF(" % D \ N- " 、SUM);
 72      }
 73です }

 

おすすめ

転載: www.cnblogs.com/randy-lo/p/12596027.html