//n个人,匹配m个任务,每个人完成每个任务的效率不同
//刚开始已经有了匹配方案,现在重新设计匹配方案,使得效率最高,且尽量保存
//原来的匹配方案,
//将所有权值*1000, 然后对于原来匹配的边的权值+1,用KM算法求出最大带权匹配ans
//那么最终的最大效率为ans/1000 , 保留原来的匹配边的个数为ans%mod
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std ;
const int maxn = 60 ;
const int mod = 1000 ;
const int inf = 0x3f3f3f3f ;
int match[maxn] , lx[maxn] , ly[maxn] , slack[maxn] ;
int w[maxn][maxn] , visx[maxn] , visy[maxn] ;
int n , m ;
bool find(int x)
{visx[x] = 1 ;for(int i = 1;i <= m;i++){if(visy[i])continue ;int tmp = lx[x] + ly[i] - w[x][i] ;if(tmp == 0){visy[i] = 1 ;if(match[i] == -1 || find(match[i])){match[i] = x ;return true ;}}else slack[i] = min(slack[i] , tmp) ;}return false ;
}
int KM()
{memset(match , -1 ,sizeof(match)) ;memset(ly , 0 , sizeof(ly)) ;for(int  i = 1;i <= n;i++){lx[i] = -inf ;for(int j = 1;j <= m;j++)lx[i] = max(lx[i] , w[i][j]) ;}for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++)slack[j] = inf ;while(1){memset(visx , 0 , sizeof(visx)) ;memset(visy , 0 , sizeof(visy)) ;if(find(i))break;int d = inf ;for(int j = 1;j <= m;j++)if(!visy[j])d = min(d , slack[j]) ;for(int j = 1;j <= n;j++)if(visx[j])lx[j] -= d ;for(int j = 1;j <= m;j++)if(visy[j])ly[j] += d ;elseslack[j] -= d ;}}int ans = 0 ;for(int i = 1;i <= m;i++)if(match[i] != -1)ans += w[match[i]][i] ;return ans ;
}int main()
{//freopen("in.txt" , "r" , stdin) ;while(~scanf("%d%d" ,&n , &m)){for(int i = 1;i <= n;i++)for(int j = 1;j <= m;j++){scanf("%d" , &w[i][j]) ;w[i][j] *= mod ;}int sum = 0 ;for(int i = 1;i <= n;i++){int a ;scanf("%d" , &a) ;sum += w[i][a]/mod ;w[i][a]++ ;}int ans = KM() ;printf("%d %d\n" , n - ans%mod , ans/mod - sum) ;}return 0 ;
}

hdu2853Assignment kM算法相关推荐

  1. 2019 ICPC Asia Nanjing Regional J.Spy(KM算法O(n^3)板子题)

    整理的算法模板合集: ACM模板 前面好几段又在讲故事- 题目大意: a[i]表示对手的每个队伍战斗力 p[i]表示打败对手后获得的分数 b[i]表示我方第一种人的战斗力 c[i]表示我方第二种人的战 ...

  2. 【算法笔记】二分图最大权匹配 - KM算法(dfs版O(n4) + bfs版O(n3))

    整理的算法模板合集: ACM模板 匈牙利算法又称为 KM 算法,可以在 O(n3)O(n^3)O(n3) 时间内求出二分图的 最大权完美匹配 . 考虑到二分图中两个集合中的点并不总是相同,为了能应用 ...

  3. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了-- 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

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

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

  5. 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法

    网上搜了好多KM算法的文章,都写得云里雾里.看了半天之后,我终于看懂了.其实KM算法非常简单,只要会匈牙利算法了,一下就能看懂KM算法. 如果大家对自己的匈牙利算法不够自信的话,可以先复习一下,放上我 ...

  6. UVA 11383 Golden Tiger Claw 金虎爪(KM算法)

    题意: 给一个n*n的矩阵,每个格子中有正整数w[i][j],试为每行和每列分别确定一个数字row[i]和col[i],使得任意格子w[i][j]<=row[i]+col[j]恒成立.先输row ...

  7. HDU 1853 HDU 3488【有向环最小权值覆盖问题 】带权二分图匹配 KM算法

    HDU 1853 & HDU 3488[有向环最小权值覆盖问题 ]最小费用最大流 In the kingdom of Henryy, there are N (2 <= N <= ...

  8. 二分图最大权匹配 KM算法

    KM算法的正确性基于以下定理: 若由二分图中所有满足A[i]+B[i]=w[i][j]的边C(i,j)构成的子图(即相等子图)有完备匹配,那么这个完备匹配就是二分图的最大权匹配 基本概念 1.完备匹配 ...

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

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

最新文章

  1. 网络工程师必须具备的素质
  2. hadoop2 作业执行过程之作业提交
  3. 「LibreOJ β Round #4」子集
  4. 数据库SQL语句 SELECT LIKE like用法详解
  5. 【JavaSE03】Java中分支语句-概念
  6. Nginx调度器(反向代理)
  7. 电大计算机应用小抄,2015年最新电大统考计算机应用基础小抄(完整版电大小抄).DOC...
  8. 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程
  9. 虹软人脸识别java调用依赖Cant‘t find dependent library错误,需安装vc2013运行环境
  10. 100个优秀安全测试工具
  11. 3.微信小程序--快速开发UI界面
  12. 基于can总线的A2L文件解析(2)
  13. 关于用ADS设计PA中电容的选择
  14. Oracle 监听器无法启动(TNS-12555,TNS-12560,TNS-00525)启动监听器无法打开,报错!
  15. python飞机大战实训报告200_飞机大战实训报告方案.doc
  16. matlab求第二类曲面积分,第二型曲面积分的参数形式计算
  17. 西门子300 PLC 功能块及背景数据块的说明
  18. 数据可视化项目(二)
  19. 网络通信学习笔记之 ———Socket网络通信
  20. SPI的模拟应用——OLED以及时钟模块的应用(一)SPI协议介绍及利用协议实现两机通信(51单片机)

热门文章

  1. ubuntu退出shell终端命令_Ubuntu下,清屏等终端常用命令
  2. index.html背景视频,index.html
  3. 无法定位程序输入点dxgiget_星球大战战机中队打不开怎么办 游戏报错修复方法...
  4. 5G NR 网络类型移动开发小记
  5. 星辰大海-激荡三十年
  6. 【生活】外包到阿里工作2年是一种什么样的体验
  7. maven下载(国内镜像)
  8. 【车辆仿真】测试用例设计方法-正交试验
  9. C++ vs+Easyx 兔子填色游戏
  10. C语言程序设计之考卷成绩分析软件程序设计