2019/7/22 匈牙利算法,KM算法

2019/7/22 匈牙利算法,KM算法这几天知识点量太大,一时间不易吸收。先占个坑,慢慢填匈牙利算法分享一位博主Dark_Scope的思路,简单易懂还有趣,虽然是初学,也马马虎虎懂了个大概https://blog.csdn.net/dark_scope/article/details/8880547#definemaxn100000intn,m;//n个男生m个女生二分图:男生在左女生在右…

    这几天知识点量太大,一时间不易吸收。先占个坑,慢慢填

匈牙利算法

分享一位博主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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注