KM算法求的是完备匹配下的最大权匹配,是Hungary算法的进一步,由于Hungary算法是最大匹配的算法,不带权。

经典算法,想不出来的了,要參考别人的。然后消化吸收吧。

由于真的非常复杂的算法。

我理解算法匹配思想:

1 開始的时候,全部边都记录自己的最优匹配,无论有没有冲突

2 递归循环的时候。假设找不到自己的最优匹配,那么就找次要匹配

3 次要匹配不行,继续找下一个次优匹配,全部点都一定要找到解

难点:

怎样记录这些信息,以便循环处理全部点。

牵涉到非常多什么增广路,交错树之类的,名词,术语,变量就一大堆。

心浮气躁可不能学这种算法了,要心平气和,深呼吸,然后慢慢消化才行。

这个博客分析挺具体的。且带图:

http://blog.csdn.net/wuxinxiaohuangdou/article/details/14056987

http://blog.csdn.net/ZYY173533832/article/details/11519291

两个博客一样的图,也不知道谁抄谁的了。

我以下算法是略微改动一点而成的程序。

主要是slack能够不使用数组记录,仅仅须要记录当前的得到的最小值就能够了。

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <limits.h>
using namespace std; const int MAX_N = 301;
int N;
int link[MAX_N];//右边到左边的连线
int slack;//当前dfs中,訪问了的点中能够让利的最小限度
bool visLeft[MAX_N], visRight[MAX_N];
int curMaxVal[MAX_N], giveAwayVal[MAX_N];
int gra[MAX_N][MAX_N]; bool Hungary(int u)
{
visLeft[u] = true;
for (int v = 1; v <= N; v++)
{
if (visRight[v]) continue;
int curSlack = curMaxVal[u] + giveAwayVal[v] - gra[u][v];
if (curSlack == 0)
{
visRight[v] = true;
if (!link[v] || Hungary(link[v]))
{
link[v] = u;
return true;
}
}
else if(slack > curSlack) slack = curSlack;
}
return false;
} int KM()
{
memset(giveAwayVal, 0, sizeof(giveAwayVal));
memset(link, 0, sizeof(link));
for (int i = 1; i <= N; i++)
curMaxVal[i] = *max_element(gra[i]+1, gra[i]+N+1); for (int i = 1; i <= N; i++)
{
while (true)
{
memset(visLeft, 0, sizeof(visLeft));
memset(visRight, 0, sizeof(visRight));
slack = INT_MAX;
if (Hungary(i)) break; for (int j = 1; j <= N; j++)
{
if (visLeft[j]) curMaxVal[j] -= slack;
if (visRight[j]) giveAwayVal[j] += slack;
}
}
}
int ans = 0;
for (int i = 1; i <= N; i++) ans += gra[link[i]][i];
return ans;
} int main()
{
while(~scanf("%d", &N))
{
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N;j++)
scanf("%d",&gra[i][j]); printf("%d\n",KM());
}
return 0;
}

HDU 2255 奔小康赚大钱 KM算法题解的更多相关文章

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  2. hdu 2255奔小康赚大钱 KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=2255 一,KM算法:(借助这个题写一下个人对km的理解与km模板) KM算法主要是用来求解图的最优匹 ...

  3. HDU - 2255 奔小康赚大钱 KM算法 模板题

    HDU - 2255 题意: 分配n所房子给n个家庭,不同家庭对一所房子所需缴纳的钱是不一样的,问你应当怎么分配房子,使得最后收到的钱最多. 思路: KM算法裸题.上模板 #include <i ...

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

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

  5. HDU 2255 奔小康赚大钱 KM算法的简单解释

    KM算法一般用来寻找二分图的最优匹配. 步骤: 1.初始化可行标杆 2.对新加入的点用匈牙利算法进行判断 3.若无法加入新编,修改可行标杆 4.重复2.3操作直到找到相等子图的完全匹配. 各步骤简述: ...

  6. hdu 2255 奔小康赚大钱 (KM)

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

  7. HDU 2255 奔小康赚大钱 KM裸题

    #include <stdio.h> #include <string.h> #define M 310 #define inf 0x3f3f3f3f int n,nx,ny; ...

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

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

  9. HDU 2255 奔小康赚大钱(带权二分图最大匹配)

    HDU 2255 奔小康赚大钱(带权二分图最大匹配) Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊 ...

随机推荐

  1. hdu3507Print Article(斜率优化dp)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  2. 原生JS---3

    原生js学习笔记3——数组 定义数组 两种方式定义一个数组: 1. var array1 = new array(1, 2, 3, 4); 2. var array2 = [1, 2, 3, 4]; ...

  3. Html5 ajax的跨域请求

    1.XMLHttpRequest升级版已经实现了跨域请求.不过需要在后台设置:header("Access-Control-Allow-Origin:http://www.a.com&quo ...

  4. Python 35 进程间的通信(IPC机制)、生产者消费者模型

    一:进程间的通信(IPC):先进先出  管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...

  5. CentOS7 搭建Kafka(一)zookeeper篇

    CentOS7 搭建Kafka(一)zookeeper篇 近几年当红小生Kafka备受各路英雄好汉追捧,一点不比老前辈RabbitMQ和ActiveMQ差,因为流行,所以你就得学啊:我这么懒,肯定是不 ...

  6. 《java数据结构与算法》系列之“开篇”

    大学的时候学习数据结构,当时吧虽然没挂这门课,但是确实学的不咋地,再但是其实自己一直都觉得数据结构很重要,是基础,只有基础好了,后面的路才能走的更好. 懒惰真的是天下的罪恶之源.所以一直到现在都毕业了 ...

  7. RunLoop相关知识

    RunLoop,翻译过来是运行环路.我们在创建命令行项目和创建ios项目时,发现命令行项目当最后一行代码执行完后项目就自动退出了,而ios项目确可以一直运行,知道用户手动点击退出按钮.这就是因为ios ...

  8. win2008系统日志不断出现【审核失败】

    win2008系统日志不断出现[审核失败] [现象] 今天查看windows日志,在  -安全-  发现不断有消息刷出,显示  -审核失败-  事件ID为4624 的记录  每分钟大概刷新8条消息(如 ...

  9. SLAM:ORB-SLAM 位姿优化描述

    只知道算法描述和代码,而不知道原理是比较扯的事情,还是把原理转载一下. 原文链接: http://www.cnblogs.com/luyb/p/5447497.html ORB-SLAM作为单目SLA ...

  10. Spring MVC 中的基于注解的 Controller(转载)

           终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法 ...