这个库有许多算法的实现,其中一个是最大的二分匹配。
以下是源代码的链接: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
时间复杂度。
但是在第三个if语句中有一个bpm
的递归函数调用。此函数的目标是运行dfs
以查找扩充路径。
我知道dfs
的时间复杂度为O(n+m)
。所以我假设函数bpm
的复杂度为O(n+m)
因此,总时间复杂度为O(m*(n+m))
然而,作者说这是O(m*n^2)
。有人可以解释我为什么会这样吗?提前谢谢!
答案 0 :(得分:1)
这里的变量有点令人困惑:M和N指的是图表每一侧的节点数。 DFS的运行时为O(E+V)
,其中E是边数。在二分图| E |中最多为N * M,V将为(N + M),因此您的DFS将采用O(NM)
。然后,总时间复杂度为O(NM^2)
。不确定N^2
的位置,可能是一个错字......