/**
匈牙利算法是解决二分图匹配问题的凶器,二分图匹配问题在实际应用中也很
广泛,诸如婚恋、交朋友这些网站,会很快介绍给你最合适的对象,这都离不开
匹配算法的支撑。
在刚接触这些算法前往往会有一种莫名的恐惧,其实任何问题的本质都是很简单的
别被这些名词吓着了,仅仅是个名词而已,当你真正接触她的时候,其实也没你想
像的那么恐惧。。
匈牙利算法连接矩阵的时间复杂度为 O(N^3),邻接表为 O(N*M) M为边数
二分图匹配:小明喜欢小丽也喜欢小雨,小强只喜欢小丽,小壮也喜欢小丽,问
怎样给这三个男生分配对象当尽可能多的男生满意?
显然:三个都喜欢小丽,假设把小丽给了小明,轮到给小强,因为小强只喜欢小丽,
可是小丽给小明了,然后把小明叫来问:你除了小丽还喜欢谁? 他说喜欢小雨,然后
就把小雨给了小明,把小丽让给了小强。这时小壮又来了,因为小壮也只喜欢小丽,
重复上次让小丽的招,发现小强只喜欢小丽,所以最多只能让两个男生满意……
上面问小明的方法就和匈牙利算法很类似……
*/
const int M = 100;
int link[M], vis[M];
int map[M][M], n, m; //n个男生, m个女生
bool dfs(int u) {
for (int i=1; i<=m; i++) {
if (!vis[i] && map[u][i]) {
vis[i] = true;
if (link[i]==-1 || dfs(link[i])) {
//如果第i 个女生还单身,或者她现在男朋友心里有别人了,则就把她给了第u 个男生
link[i] = u; //link[i] 记录第i 个女生给了第u 个男生
return true;
}
}
}
return false;
}
int hungary() {
int ans = 0;
memset(link, -1, sizeof (link));
for (int i=1; i<=n; i++) {
memset(vis, 0, sizeof (vis));
if (dfs(i)) ans++;
}
return ans;
}
/**
注意:map[][] 初始化为0,link[] 要初始化为-1 因为有可能有0 点
这些图算法别看有模板,跪在建图,建图才是王道,必须得练
基本练习:POJ 2239 1325 3692(最大独立点) 1274
*/
收藏于 2011-11-20
来自于百度空间
匈牙利算法(二分图匹配)
最新推荐文章于 2024-03-07 23:20:27 发布