hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255
题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要求所有人回去的距离最短.
KM算法模板题~
#include "stdio.h" //hdu 2255
#include "string.h"
#include "stdlib.h"#define N 305
#define INF 0x3fffffffint n;
int match[N];
int map[N][N];
int lx[N],ly[N]; bool s[N],t[N];//s[],t[]记录当前左/右第i个点是否在匈牙利树中inline int MIN(int a,int b) { return a<b?a:b; }
inline int MAX(int a,int b) { return a>b?a:b; }bool find(int x) //匈牙利,匹配(找增广路)
{int y;s[x] = true;for(y=1; y<=n; ++y){if(!t[y] && lx[x]+ly[y]==map[x][y]){t[y] = true;if(match[y]==-1 || find(match[y])){match[y] = x;return true;}}}return false;
}int KM()
{int i,j,k;int ans=0;memset(match,-1,sizeof(match));memset(lx,0,sizeof(lx));memset(ly,0,sizeof(ly));for(i=1; i<=n; ++i) //初始化S顶标为最大权 {for(j=1; j<=n; ++j)lx[i] = MAX(lx[i],map[i][j]);}for(i=1; i<=n; ++i) //匹配每一个点 {while(1){memset(s,0,sizeof(s));memset(t,0,sizeof(t));if(find(i)) //点i匹配成功 break;else //匹配失败,找最小值num {int num = INF;for(j=1; j<=n; ++j){if(s[j]) //j在匈牙利树中 {for(k=1; k<=n; ++k){if(!t[k]) //k在匈牙利树外num = MIN(num,lx[j]+ly[k]-map[j][k]);}}}for(k=1; k<=n; ++k) //修改顶标 { if(s[k]) lx[k] -= num; //保证至少有一条边可以加入if(t[k]) ly[k] += num; //保证原来匹配的边修改后依然可以匹配 }}}}for(i=1; i<=n; ++i)ans += map[match[i]][i];return ans;
}int main()
{int i,j;while(scanf("%d",&n)!=-1){for(i=1; i<=n; ++i){for(j=1; j<=n; ++j)scanf("%d",&map[i][j]);}printf("%d\n",KM());}return 0;
}
转载于:https://www.cnblogs.com/ruo-yu/p/4411966.html
hdu 2255 奔小康赚大钱--KM算法模板相关推荐
- hdu 2255 奔小康赚大钱 KM算法
看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了-- 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...
- 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱
作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...
- KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home
最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...
- HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU - 2255 奔小康赚大钱(二分图最大权匹配+KM)
题目链接:点击查看 题目大意:中文题目,简单来说就是n个人和n个房子最大匹配,需要一一对应并且满足权值和最大 题目分析:二分图的完备匹配,条件完全符合KM算法的局限性,直接套模板即可,后续学习费用流( ...
- HDUOJ 2255 奔小康赚大钱
HDUOJ 2255 奔小康赚大钱 题目链接 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住 ...
- 二分图最佳匹配 KM算法 Hdu2255奔小康赚大钱 + Poj 3565 Ants
2014-10-4 更新 在最下面增加了基于邻接表的模板 理论:http://blog.sina.com.cn/s/blog_691ce2b701016reh.html http://philosci ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDUOJ---------2255奔小康赚大钱
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
最新文章
- C++中引用的一些问题
- 博通1300亿美元收购高通,一场充满大饼和落井下石的“大戏”
- 做程序开发的你如果经常用Redis,这些问题肯定会遇到
- 如何从Angular的ActivatedRoute数据结构中获得运行时路由信息
- Java获取方法信息(某一函数,方法也是一个对象)
- 安卓手机备份_备份安卓手机中的APK安装文件?小编这儿有4种方法
- 我是如何寻找数据集的,一些个人私藏
- 阿里数据中台大火,国外却在建设数据湖,这两者什么关系?
- 代码换肤术——C#和VB(摘抄)
- java 获取叶子节点_java – 如何获取树的所有叶节点?
- AltiumDesigner(三):PCB导出Gerber文件及各个Gerber文件说明
- 修改APP默认横屏或竖屏
- LumaQQ.NET For Visual Studio 2005 代码下载
- 蓝牙开发那些事儿(1)——从抓包数据开始
- xp系统怎么更改计算机用户名和密码,如何解决用户不能更改WindowsXP系统密码
- c++ qt 操作Excel 实现冻结窗格的功能。
- 比较工具导出html比较结果,使用Beyond Compare如何生成文件比较报告
- 从零开始搭建博客Hexo-Node-Git搭建博客
- 【链想会】第八期 分布式商业管理的内在逻辑和价值思考
- 再见,2016(本兮)
热门文章
- JSP GridView --使用自定义标签实现ASP.NET的控件
- Android学习笔记之自定义Toast
- 动态规划算法的优化技巧
- JAVA线程池(ThreadPoolExecutor)源码分析
- Java虚拟机的研究与实现
- muduo之CountDownLatch.cc
- STM32的IIC应用详解2
- char N2Char(int n)函数:将一个整数转换为字符串,并放入一个字符串中
- ****** 三十五 ******、软设笔记【网络基础】-安全性、可靠性与系统性能评测-数据安全与保密...
- laravel中及其常用的一些函数方法(自己看)和技巧(不断添加中)