HDU 2255 奔小康赚大钱 KM算法题解
来源:互联网 发布:python sleep 编辑:程序博客网 时间:2024/06/01 11:22
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; }
1 0
- HDU 2255 奔小康赚大钱 KM算法题解
- HDU 2255 奔小康赚大钱 KM算法
- hdu 2255 奔小康赚大钱 KM算法
- [HDU 2255]奔小康赚大钱[KM算法]
- hdu 2255 奔小康赚大钱 KM算法
- HDU 2255奔小康赚大钱 km算法
- hdu 225 奔小康赚大钱 Km 算法
- HDU 2255 奔小康赚大钱(KM算法)
- 奔小康赚大钱 hdu 2255 KM算法入门题目
- hdu 2255 奔小康赚大钱--KM算法模板
- hdu 2255 奔小康赚大钱(KM算法)
- hdu 2255 奔小康赚大钱 KM算法 模板题
- HDU 2255 奔小康,赚大钱(KM算法模版)
- HDU 2255 奔小康赚大钱 (KM算法)
- hdu 2255奔小康赚大钱 KM算法模板
- HDU 2255 奔小康赚大钱 (KM算法 模板)
- hdu 2255 奔小康赚大钱(KM算法)
- HDU 2255 奔小康赚大钱 (二分图:KM算法)
- UITableView选中cell
- Windows Embedded CE 6.0 Internals (4) The Mechanism of API
- 排序算法汇总总结
- Android 中this、 getApplicationContext()、getApplication()之间的区别
- 中国软件测试现状调查报告发布啦!!
- HDU 2255 奔小康赚大钱 KM算法题解
- CONVERT(varchar(12),getdate(),112 )
- mysql一些问题的解决方法 ERROR 1045 (28000)|在同一服务器上启动不同端口
- 使用WHM重新编译Apache+PHP环境
- 专访雷果国:从1.5K到18K 一个程序员的5年成长之路
- qt 没有被正确安装 请运行make install
- Magento报错General error: 1030 Got error 28 from storage engine
- AtomicInteger简介
- GDIPlus绘制桌面歌词