题目链接: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算法模板相关推荐

  1. hdu 2255 奔小康赚大钱 KM算法

    看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了-- 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...

  2. 二分图最大权匹配问题KM算法讲解 HDU 2255 奔小康赚大钱

    作者:logosG 链接:https://www.cnblogs.com/logosG/p/logos.html (讲解的KM算法,特别厉害!!!) KM算法: 现在我们来考虑另外一个问题:如果每个员 ...

  3. KM算法 最优匹配(最大权匹配) hdu 2255 奔小康赚大钱 最小权匹配 poj 2195 Going Home

    最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大.解决这个问题可以用KM算法.理解KM算法需要首先理解"可行顶标"的概念.可行顶标是指关于二分图 ...

  4. HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. HDU - 2255 奔小康赚大钱(二分图最大权匹配+KM)

    题目链接:点击查看 题目大意:中文题目,简单来说就是n个人和n个房子最大匹配,需要一一对应并且满足权值和最大 题目分析:二分图的完备匹配,条件完全符合KM算法的局限性,直接套模板即可,后续学习费用流( ...

  6. HDUOJ 2255 奔小康赚大钱

    HDUOJ 2255 奔小康赚大钱 题目链接 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住 ...

  7. 二分图最佳匹配 KM算法 Hdu2255奔小康赚大钱 + Poj 3565 Ants

    2014-10-4 更新 在最下面增加了基于邻接表的模板 理论:http://blog.sina.com.cn/s/blog_691ce2b701016reh.html http://philosci ...

  8. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. HDUOJ---------2255奔小康赚大钱

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

最新文章

  1. C++中引用的一些问题
  2. 博通1300亿美元收购高通,一场充满大饼和落井下石的“大戏”
  3. 做程序开发的你如果经常用Redis,这些问题肯定会遇到
  4. 如何从Angular的ActivatedRoute数据结构中获得运行时路由信息
  5. Java获取方法信息(某一函数,方法也是一个对象)
  6. 安卓手机备份_备份安卓手机中的APK安装文件?小编这儿有4种方法
  7. 我是如何寻找数据集的,一些个人私藏
  8. 阿里数据中台大火,国外却在建设数据湖,这两者什么关系?
  9. 代码换肤术——C#和VB(摘抄)
  10. java 获取叶子节点_java – 如何获取树的所有叶节点?
  11. AltiumDesigner(三):PCB导出Gerber文件及各个Gerber文件说明
  12. 修改APP默认横屏或竖屏
  13. LumaQQ.NET For Visual Studio 2005 代码下载
  14. 蓝牙开发那些事儿(1)——从抓包数据开始
  15. xp系统怎么更改计算机用户名和密码,如何解决用户不能更改WindowsXP系统密码
  16. c++ qt 操作Excel 实现冻结窗格的功能。
  17. 比较工具导出html比较结果,使用Beyond Compare如何生成文件比较报告
  18. 从零开始搭建博客Hexo-Node-Git搭建博客
  19. 【链想会】第八期 分布式商业管理的内在逻辑和价值思考
  20. 再见,2016(本兮)

热门文章

  1. JSP GridView --使用自定义标签实现ASP.NET的控件
  2. Android学习笔记之自定义Toast
  3. 动态规划算法的优化技巧
  4. JAVA线程池(ThreadPoolExecutor)源码分析
  5. Java虚拟机的研究与实现
  6. muduo之CountDownLatch.cc
  7. STM32的IIC应用详解2
  8. char N2Char(int n)函数:将一个整数转换为字符串,并放入一个字符串中
  9. ****** 三十五 ******、软设笔记【网络基础】-安全性、可靠性与系统性能评测-数据安全与保密...
  10. laravel中及其常用的一些函数方法(自己看)和技巧(不断添加中)