题目传送门

  1. /*
  2. KM:裸题第一道,好像就是hungary的升级版,不好理解,写点注释
  3. KM算法用来解决最大权匹配问题: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接Xi,Yj有权w(i,j),
  4. 求一种匹配使得所有w(i,j)的和最大。也就是最大权匹配一定是完备匹配。如果两边的点数相等则是完美匹配。
  5. 如果点数不相等,其实可以虚拟一些点,使得点数相等,也成为了完美匹配。最大权匹配还可以用最大流去解决
  6. */
  7. #include <cstdio>
  8. #include <algorithm>
  9. #include <cstring>
  10. using namespace std;
  11. const int MAXN = 3e2 + ;
  12. const int INF = 0x3f3f3f3f;
  13. int x[MAXN], y[MAXN], w[MAXN][MAXN];
  14. int lx[MAXN], ly[MAXN];
  15. bool visx[MAXN], visy[MAXN];
  16. int n, d;
  17. bool DFS(int u) { //hungary算法
  18. visx[u] = true;
  19. for (int i=; i<=n; ++i) {
  20. if (x[u] + y[i] == w[u][i] && !visy[i]) {
  21. visy[i] = true;
  22. if (ly[i] == - || DFS (ly[i])) {
  23. ly[i] = u; return true;
  24. }
  25. }
  26. else if (x[u] + y[i] > w[u][i]) d = min (d, x[u] + y[i] - w[u][i]); //更新d,贪心思想
  27. }
  28. return false;
  29. }
  30. void KM(void) {
  31. for (int i=; i<=n; ++i) {
  32. x[i] = ;
  33. for (int j=; j<=n; ++j) {
  34. x[i] = max (x[i], w[i][j]); //初始x标杆为最大值w,y为0
  35. }
  36. }
  37. memset (y, , sizeof (y));
  38. memset (ly, -, sizeof (ly));
  39. for (int i=; i<=n; ++i) {
  40. while (true) {
  41. memset (visx, false, sizeof (visx));
  42. memset (visy, false, sizeof (visy));
  43. d = INF;
  44. if (DFS (i)) break; //找到增广轨,退出
  45. for (int i=; i<=n; ++i) { //没有找到,对标杆进行调整
  46. if (visx[i]) x[i] -= d;
  47. if (visy[i]) y[i] += d;
  48. }
  49. }
  50. }
  51. int res = ;
  52. for (int i=; i<=n; ++i) {
  53. res += x[i] + y[i];
  54. }
  55. printf ("%d\n", res);
  56. }
  57. int main(void) { //HDOJ 2255 奔小康赚大钱
  58. //freopen ("HDOJ_2255.in", "r", stdin);
  59. while (scanf ("%d", &n) == ) {
  60. for (int i=; i<=n; ++i) {
  61. for (int j=; j<=n; ++j) {
  62. scanf ("%d", &w[i][j]);
  63. }
  64. }
  65. KM ();
  66. }
  67. return ;
  68. }

最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱的更多相关文章

  1. 最大流增广路(KM算法) HDOJ 1533 Going Home

    题目传送门 /* 最小费用流:KM算法是求最大流,只要w = -w就可以了,很经典的方法 */ #include <cstdio> #include <cmath> #incl ...

  2. 最大流增广路(KM算法) HDOJ 1853 Cyclic Tour

    题目传送门 /* KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法 */ #include <cstdio> #include <cmath> #incl ...

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

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

  4. [ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)

    奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间 ...

  5. HDU 2255 ——奔小康赚大钱——————【KM算法裸题】

    奔小康赚大钱 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  6. HDU 2255 奔小康赚大钱 (KM算法 模板题)

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

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

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

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

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

  9. HDU 2255 奔小康赚大钱 KM算法题解

    KM算法求的是完备匹配下的最大权匹配,是Hungary算法的进一步,由于Hungary算法是最大匹配的算法,不带权. 经典算法,想不出来的了,要參考别人的.然后消化吸收吧. 由于真的非常复杂的算法. ...

随机推荐

  1. android开发里跳过的坑——图片文件上传失败

    使用的apache的httpclient的jar包,做的http图片上传,上传时,服务器总返文件格式不对.后来发现,是由于在创建FileBody时,使用了默认的ContentType引起的.所以服务器 ...

  2. 2018/2/20 Springretry,Feign,以及用通俗的语言(自认为)教会你关于Hystrix的复杂概念

    本来想昨天写的,但临时有事.弄的一晚上都没睡觉,现在头好晕,所以此笔记如果有语言措辞的组织不当,还请见谅:最后,本文可能涉及到大量专业名词,我会尽量用通俗的语句去阐述清楚它们的意思,但如果还是没看懂, ...

  3. Jam's balance set 暴力

    Jim has a balance and N weights. (1≤N≤20)(1≤N≤20) The balance can only tell whether things on differ ...

  4. 洛谷——P1062 数列

    洛谷——P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,1 ...

  5. Windows 10+Ubuntu 16.04在MBR分区上安装双系统之后启动菜单的System Setup选项提示:can't find command "fwsetup"

    背景: 硬盘分区方式:MBR 硬盘容量256,Windows 100,Ubuntu 156,其中主分区安装的是Windows,Ubuntu安装在逻辑分区上,文件系统为Ext4,整个Ubuntu就挂载在 ...

  6. 未能找出类型或命名空间名称“T” 问题的解决方案

    在已经引用“using System.Collections.Generic;”时,还是提示急未能找出类型或命名空间名称“T”的问题.

  7. 计算机常识--win7 删除文件、拒绝訪问等等,所有提示权限不够 解决的方法

    本来都不想写这些东西的,可是又常常遇到,还是记录一下吧! 一键获取管理员的最高权限 创建一个txt文件,然后将其后缀改为.reg格式:内容例如以下 Windows Registry Editor Ve ...

  8. 手把手教你开发Chrome扩展二:为html添加行为

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 上一节我们 ...

  9. 自己构建的Lumbda表达式

    自己构建的Lumbda表达式 定义接口: package com.stono.lambda; public interface Add { public void add(int x, int y); ...

  10. iOS8使用TouchID

    iOS8新增了LocalAuthentication框架,用于TouchID的授权使用.亲測,眼下须要用户的设备支持指纹识别并已设置锁屏,并且实际測试过程中反馈比較慢.不能直接跟第三方账号passwo ...