【算法学习】二分图最大匹配之初始:匈牙利算法

邻接矩阵版本

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;
}


posted @ 2014-11-04 15:42  千灵域  阅读(3)  评论(0)    收藏  举报