有这个库实现了许多算法,其中之一是最大二分匹配。
这是源代码的链接: 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;
}
我们有一个运行m
时间的 for 循环。这个数字m
是指工人的数量。然后我们进入bpm
有另一个for循环的函数。这个循环运行的n
时间n
是任务的数量。
到目前为止,我们有m*n
时间复杂度。
然而,bpm
在第三个 if 语句中有一个递归函数调用。此函数的目标是运行 adfs
以找到增强的路径。
我知道这dfs
有时间复杂度O(n+m)
。所以我会假设该函数bpm
的复杂性为O(n+m)
因此总时间复杂度为O(m*(n+m))
但是作者说它是O(m*n^2)
. 有人可以解释一下为什么会这样吗?先感谢您!