多くのアルゴリズムが実装されているこのライブラリがあり、そのうちの1つは最大2部マッチングです。
ソースコードへのリンクは次のとおりです:http ://shygypsy.com/tools/bpm.cpp
ここにも含めます(コメントなし)
#include <string.h>
#define M 128
#define N 128
bool graph[M][N];
bool seen[N];
int matchL[M], matchR[N];
int n, m;
bool bpm( int u )
{
for( int v = 0; v < n; v++ )
if( graph[u][v] )
{
if( seen[v] ) continue;
seen[v] = true;
if( matchR[v] < 0 || bpm( matchR[v] ) )
{
matchL[u] = v;
matchR[v] = u;
return true;
}
}
return false;
}
int main()
{
memset( matchL, -1, sizeof( matchL ) );
memset( matchR, -1, sizeof( matchR ) );
int cnt = 0;
for( int i = 0; i < m; i++ )
{
memset( seen, 0, sizeof( seen ) );
if( bpm( i ) ) cnt++;
}
return 0;
}
実行時間のforループがありますm
。数字m
は労働者の数を表しています。次に、bpm
別のforループを持つ関数に入ります。このループは、タスクの量であるn
回数を実行します。n
今まではm*n
時間計算量がありました。
bpm
ただし、3番目のifステートメントにはの再帰関数呼び出しがあります。この関数の目的はdfs
、拡張パスを見つけるためにを実行することです。
私はそれdfs
が時間の複雑さを持っていることを知っていますO(n+m)
。したがって、関数bpm
の複雑さは次のようになります。O(n+m)
したがって、合計時間計算量は次のようになります。O(m*(n+m))
しかし、作者はそれがだと言いますO(m*n^2)
。誰かが私にこれが事実である理由を説明できますか?前もって感謝します!