二分图最优匹配之KM算法
来源:互联网 发布:空手道数据集 编辑:程序博客网 时间:2024/05/23 01:23
概念:完全二分图G(X∪Y,X×Y)的最大权和匹配;
ps:若集合X和集合Y不是完全二分图或集合X和集合Y的顶点个数不相等,可构造0权值的边或产生0权值的顶点;
Kuhn-Munkres算法流程:
(1)初始化可行顶标的值;
(2)用匈牙利算法寻找完备匹配;
(3)若未找到完备匹配则修改可行顶标的值;
(4)重复(2)(3)直到找到相等子图的完备匹配为止。
时间复杂度:朴素实现O(n^4),不过通过加入松弛量可以做到O(n^3)
代码:(O(n^3))
const int N = 20, inf = 2147483647;int w[N][N], match[N], visx[N], visy[N], lack;int lx[N] = {0}, ly[N] = {0}; //顶标bool dfs(int x) { visx[x] = true; for (int y = 0; y < N; ++y) { if (visy[y]) continue; int t = lx[x] + ly[y] - w[x][y]; if (t==0) { visy[y] = true; if (match[y]==-1 || dfs(match[y])) { linky[y] = x; return true; } } else lack = min(lack, t); } return false;}int km() { memset(match, -1, sizeof(match)); for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) lx[i] = max(lx[i], w[i][j]); //初始化顶标 for (int x = 0; x < N; ++x) { for (; ;) { memset(visx, 0, sizeof(visx)); memset(visy, 0, sizeof(visy)); lack = inf; if (dfs(x)) break; for (int i = 0; i < N; ++i) { if (visx[i]) lx[i] -= lack; if (visy[i]) ly[i] += lack; } } } int res = 0; for (int j = 0; j < N; ++j) if(match[j]>-1) res += w[match[j]][j]; return res;}
阅读全文
1 0
- 二分图最优匹配之KM算法
- HDU3722 Card Game 二分图之最优匹配 KM算法
- KM算法求二分图最优匹配
- 二分图的最优匹配(KM算法)
- 二分图最优匹配 杭电 2255 KM算法
- poj 2195 二分图最优匹配 KM算法求最小值
- 带权的二分图的最优匹配KM算法
- hdu 3722 二分图 最优完备匹配 KM算法
- hdu 1533 KM算法 二分图最优匹配
- poj 2195 Going Home(二分图最优匹配KM算法)
- poj 2195 二分图最优匹配KM算法 模板题
- hdu2426 二分最优匹配KM算法
- 二分最优匹配,KM算法详解
- 二分图匹配【KM算法】
- 二分图匹配之最佳匹配 km算法详解
- POJ 2195 Going Home【KM算法-二分图的最优匹配】
- KM算法,二分图的最优匹配,(也不知道怎么叫了)
- hdu 2255 奔小康赚大钱 (二分图最优匹配,KM算法)
- plsql中round()、trunc()、to_char()的使用
- github 代码提交步骤
- VS2013 动态库编译无法启动***.dll文件
- Eclipse——内存溢出设置
- C++容器适配器
- 二分图最优匹配之KM算法
- Caffe: 贾扬清2015年讲座
- Java IO知识点总结一(File类)
- atexit函数 exit 和_exit 的区别
- 利用RandomAccessFile对文件进行切割存储
- 机器学习-监督学习
- OpenMV人脸识别
- java Map 学习笔记
- Mybatis集成Spring MVC,使用Spring test进行测试