这几天知识点量太大,一时间不易吸收。先占个坑,慢慢填
匈牙利算法
分享一位博主Dark_Scope的思路,简单易懂还有趣,虽然是初学,也马马虎虎懂了个大概 https://blog.csdn.net/dark_scope/article/details/8880547
#define maxn 100000
int n,m;//n个男生 m个女生 二分图:男生在左女生在右
bool line[maxn][maxn]; //两者之间相互喜欢
bool used[maxn];//记录是否被标记过
int girl[maxn];//记录右边女生所对应的男生的编号
bool find(int x) {
int i,j;
for(j=1; j<=m; j++) {
if(line[x][j]==true&&used[j]=false) {//如果相互喜欢且没有
//被标记过(标记指这次查找曾试图改变过此人的归属问题,
//但没有成功,已经被标记了,也就不用费功夫了)
used[j] = 1; //被标记
if(girl[j]==0 || find(girl[j])) { //短路
girl[j]=x;
return true;
}
}
}
return false;
}
int main() {
int ans=0; //最大匹配个数
for(int i=1;i<=n;i++) { //二分图左边依次遍历
memset(used,0,sizeof(used)); //每次都要清空标记,方便“腾”人
ans += find(i);
}
}
KM算法
主要用来解决带权二分图的匹配问题,在保证最大匹配的前提使得权值和最大。
步骤:
1.分别为左右点设置标杆,左边初始为最大值,右边设置为0。
2. 对于左边的点,首先考虑权值最大的边与之相连,连接的前提是左右点的标杆值和等于权值。
3.存在矛盾就减少增广路上左边的权值同时增加增广路右边的权值
4.重复以上步骤直到匹配结束。
参见博主hehedad的思路,写的同样很好嗷。 https://blog.csdn.net/chenshibo17/article/details/79933191
今天的文章2019/7/22 匈牙利算法,KM算法分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12040.html