【算法学习】二分图最大匹配之初始:匈牙利算法
邻接矩阵版本
int xN, yN; // 表示X、Y两部分点的数目。
int matchX[N], matchY[N]; // 表示与对应的X、Y部分匹配的点。
bool used[N]; // 标记y[b]中的点是否被使用过。
bool SearchPath(int x) // 从x出发寻找增广路,如果找不到则返回false。
{
for(int y = 0; y < yN; y++)
if(G[x][y] && !used[y])
{
used[y] = true;
if(matchY[y] == -1 || SearchPath(matchY[y]))
{
matchY[y] = x; matchX[x] = y;
return true;
}
}
return false;
}
int MamatchXatch() // 返回值表示最大匹配数
{
/* 事先需要对xN和yN初始化,即算出X、Y两部分点的数目! */
int ret = 0;
memset(matchX, -1, sizeof(matchX));
memset(matchY, -1, sizeof(matchY));
for(int x = 0; x < xN; x++)
if(matchX[x] == -1)
{
memset(used, false, sizeof(used));
if(SearchPath(x)) ret++;
}
return ret;
}