Kuhn-Munkres算法。带权二分图匹配模板 (bin神小改版本)
/******************************************************
二分图最佳匹配 (kuhn munkras 算法 O(m*m*n)).
邻接矩阵形式 。 返回最佳匹配值,传入二分图大小m,n
邻接矩阵 map ,表示权,m1,m2返回一个最佳匹配,为匹配顶点的match值为-1,
一定注意m<=n,否则循环无法终止,最小权匹配可将全职取相反数。
初始化: for(i=0;i<MAXN;i++)
for(j=0;j<MAXN;j++) mat[i][j]=-inf;
对于存在的边:mat[i][j]=val;//注意不能负值
********************************************************/ #define MAXN 15
int n,m;
int m1[MAXN];
int m2[MAXN];
bool isequal(double a,double b)
{
if(fabs(a-b)<0.00000001)
return ;
return ;
} double km_match(int m,int n,double map[][MAXN])
{
int s[MAXN],t[MAXN];
double l1[MAXN],l2[MAXN];
int p,q,i,j,k;
double res=;
for(i=;i<m;i++)
{
l1[i]=-; for(j=;j<n;j++)
l1[i]=map[i][j]>l1[i]?map[i][j]:l1[i];
if(isequal(l1[i],-))
return -;
} for(i=;i<n;i++)
l2[i]=;
memset(m1,-,sizeof(m1));
memset(m2,-,sizeof(m2));
for(i=;i<m;i++)
{
memset(t,-,sizeof(t));
p=;q=;
for(s[]=i;p<=q&&m1[i]<;p++)
{
for(k=s[p],j=;j<n&&m1[i]<;j++)
{
if(isequal(l1[k]+l2[j],map[k][j])&&t[j]<)
{
s[++q]=m2[j];
t[j]=k;
if(s[q]<)
{
for(p=j;p>=;j=p)
{
m2[j]=k=t[j];
p=m1[k];
m1[k]=j;
}
}
}
}
} if(m1[i]<)
{
i--;
double pp=;
for(k=;k<=q;k++)
{
for(j=;j<n;j++)
{
if(t[j]<&&l1[s[k]]+l2[j]-map[s[k]][j]<pp)
pp=l1[s[k]]+l2[j]-map[s[k]][j];
}
}
for(j=;j<n;j++)
l2[j]+=t[j]<?:pp;
for(k=;k<=q;k++)
l1[s[k]]-=pp;
}
}
for(i=;i<m;i++)
res+=map[i][m1[i]];
return res;
}
Kuhn-Munkres算法。带权二分图匹配模板 (bin神小改版本)的更多相关文章
- 运动员最佳匹配问题 KM算法:带权二分图匹配
题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...
- KM(Kuhn-Munkres)算法求带权二分图的最佳匹配
KM(Kuhn-Munkres)算法求带权二分图的最佳匹配 相关概念 这个算法个人觉得一开始时有点难以理解它的一些概念,特别是新定义出来的,因为不知道是干嘛用的.但是,在了解了算法的执行过程和原理后, ...
- HDU 2255 奔小康赚大钱(带权二分图最大匹配)
HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...
- POJ 2195 Going Home (带权二分图匹配)
POJ 2195 Going Home (带权二分图匹配) Description On a grid map there are n little men and n houses. In each ...
- Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)
Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...
- [HAOI2008]移动玩具(状压&带权二分图)
题目描述 • 一个 4 × 4 的 0/1 矩阵 • 每次可以交换相邻两个元素 • 求从初始状态到目标状态的最小交换次数 输入格式 前四行,每行一个长为 4 的 0/1 字符串,描述初始状态. 后四行 ...
- POJ 2195 Going Home | 带权二分图匹配
给个地图有人和房子 保证人==房子,每个人移动到房子处需要花费曼哈顿距离的代价 问让人都住在房子里最小代价 显然是个带权二分图最大匹配 转化成以一个网络,规定w是容量,c是代价 1.S向人连边,w=1 ...
- 费用流模板(带权二分图匹配)——hdu1533
/* 带权二分图匹配 用费用流求,增加源点s 和 汇点t */ #include<bits/stdc++.h> using namespace std; #define maxn 1000 ...
- UVA1349(带权二分图最大匹配 --> KM算法模板)
UVA1349 题意:给定一些有向带权边,求出把这些边构造成一个个环,总权值最小 解法: 对于带权的二分图的匹配问题可以用通过KM算法求解. 要求最大权匹配就是初始化g[i][j]为0,直接跑就可以: ...
随机推荐
- php PDO操作乱码问题
前阶段用php写了一个小网页(每周一练),然后就一直忙着其他事也没管它,今天想着给它写个添加数据的页面,用pdo操作,没想到插入数据库的中文数据竟然乱码了,竟然乱码了!然后我就方了,赶紧检测数据传输过 ...
- ORCL_INSTALL_WIN10
0.相关问题 INS-13001环境不满足最低要求: Win10下安装Oracle11g 不满足配置解决方法如下: 原因:Oracle 在发布 11g时,Winodws 10还没有发布.所以Oracl ...
- 170109、JSONP是什么
一.JSONP的诞生 首先,因为ajax无法跨域,然后开发者就有所思考 其次,开发者发现, <script>标签的src属性是可以跨域的 把跨域服务器写成 调用本地的函数 ,回调数据回来不 ...
- 单源最短路径(dijkstra算法)php实现
做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...
- Cocos2D-x权威指南: CCNode类方法:
5.1.4 画图节点CCNode和图层CCLayer CCNode中提供的方法,在public块中的方法主要有下面几个部分: 1.针对节点显示的属性信息读写 2.针对节点变换的属性信息读写 3.针对子 ...
- BNU10804:域名统计
域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置),目前域名已经成为 互联网的品牌.网 ...
- Android学习之多点触摸并不神秘
最近研究了一下多点触摸,写了个利用多点触摸来控制图片大小和单点触摸控制图片移动的程序,和大家分享分享. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下 ...
- emacs快捷键学习(一)--Linux最强大的编辑器
emacs是一个非常强大的编辑器.经常使用的快捷键总结例如以下: 退出emacs:ctrl+x ctrl+c 移动到下一屏:ctrl+v 移动到上一屏:alt+v 将光标所在行移动到屏幕中间:ctrl ...
- C# winform xml的增删改查
代码如下: using System; using System.Collections.Generic; using System.IO; using System.Linq; using Syst ...
- springmvc入门详解
首先,我们先写一个入门小案例,先熟悉一下springmvc是什么,了解一下springmvc的运行流程,对加强springmvc的深层理解有很大帮助 .第一步,创建一个maven项目: <?xm ...