HDU 2255 二分图最佳匹配 模板题
题目大意:
给定每一个人能支付的房子价值,每个人最多且必须拥有一套房子,问最后分配房子可得到的最大收益
抄了个别人的KM模板,就这样了。。。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 #define N 305 7 const int INF = 0x7fffffff; 8 int n , nx , ny; 9 int slack[N] , lx[N] , ly[N] , linker[N] , w[N][N] , visx[N] , visy[N]; 10 11 int dfs(int u) 12 { 13 visx[u] = 1; 14 for(int y=1 ; y<=ny ; y++){ 15 if(visy[y]) continue; 16 int tmp = lx[u]+ly[y]-w[u][y]; 17 if(tmp == 0){ 18 visy[y]=1; 19 if(linker[y]==-1 || dfs(linker[y])){ 20 linker[y]=u; 21 return 1; 22 } 23 } 24 else if(slack[y]>tmp) slack[y] = tmp; 25 } 26 return 0; 27 } 28 29 int KM() 30 { 31 memset(linker , -1 , sizeof(linker)); 32 memset(ly , 0 , sizeof(ly)); 33 //lx初始化为最大的边长 34 for(int i=1 ; i<=nx ; i++) 35 { 36 lx[i] = -INF; 37 for(int j=1 ; j<=ny ; j++) 38 lx[i] = max(lx[i] , w[i][j]); 39 } 40 for(int i=1 ; i<=nx ; i++){ 41 for(int j=1 ; j<=ny ; j++){ 42 slack[j] = INF; 43 } 44 while(true){ 45 memset(visx , 0 , sizeof(visx)); 46 memset(visy , 0 , sizeof(visy)); 47 if(dfs(i)) break; //若找不到增广路,就需要改变一下标号 48 int a = INF; 49 for(int k=1 ; k<=ny ; k++) 50 if(!visy[k]&&a>slack[k]) 51 a = slack[k]; 52 for(int k=1 ; k<=nx ; k++) 53 if(visx[k]) 54 lx[k]-=a; 55 for(int k=1 ; k<=nx ; k++) 56 if(visy[k]) ly[k]+=a; 57 else slack[k]-=a; 58 } 59 } 60 int res = 0; 61 for(int i=1 ; i<=ny ; i++) 62 if(linker[i]!=-1) 63 res+=w[linker[i]][i]; 64 return res; 65 } 66 67 int main() 68 { 69 // freopen("in.txt" , "r" , stdin); 70 while(~scanf("%d" , &n)) 71 { 72 for(int i=1 ; i<=n ; i++) 73 for(int j=1 ; j<=n ; j++) scanf("%d" , &w[i][j]); 74 nx = n , ny = n; 75 int ans = KM(); 76 printf("%d\n" , ans); 77 } 78 return 0; 79 }
转载于:https://www.cnblogs.com/CSU3901130321/p/4710924.html
HDU 2255 二分图最佳匹配 模板题相关推荐
- HDU - 奔小康赚大钱(二分图最佳匹配+KM)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- POJ 2195 【二分图最佳匹配】.cpp
题意: 有 n 个房子和 n 个人 每个人走一个单元你就要付 1$ 有什么办法可以让把所有人都分派到房子里 而花费最少 输入: 给出n m 表示该矩阵由n 行 m 列组成 然后给出一个n*m的图 . ...
- UOJ#80 二分图最大权匹配 [模板题]
从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,-,nl1,-,nl 和 1,-,nr1,-,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...
- hdu 2255二分图最大权值匹配的KM 算法
对KM的深入理解请看以下博客(写的不错的):http://blog.sina.com.cn/s/blog_691ce2b701016reh.html 我的理解:如有错误,请大牛指正!! 1.KM()算 ...
- POJ365Ants_二分图最佳匹配
https://blog.csdn.net/lianai911/article/details/44835659 题意: 在坐标系中有N只蚂蚁,N棵苹果树,给你蚂蚁和苹果树的坐标.让每只蚂蚁去一棵苹果 ...
- 二分图最佳匹配 KM算法 Hdu2255奔小康赚大钱 + Poj 3565 Ants
2014-10-4 更新 在最下面增加了基于邻接表的模板 理论:http://blog.sina.com.cn/s/blog_691ce2b701016reh.html http://philosci ...
- HDU 3353 二分图的匹配,最大独立集==最小覆盖点
题意::从中选出最多的数能够使得其两两之间不能整除 既然是找两两之间不能整除的集合里面的个数,那就是用所有的点减去能够匹配到的整除的匹配数就行,这就是最大独立集 都说这题需要去重但是可以不用去,但需要 ...
- 单词数 HDU - 2072(字典树模板题amp;stl)
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input 有多组数据,每组一行,每组就 ...
- UVA-1045 - The Great Wall Game(二分图最佳匹配)
题意:在一个n*n的棋盘上有n个棋子,要求通过移动棋子使棋子的排布满足以下情况之一:呈横行排列:呈纵行排列:呈对角线排列(有两条). 棋子移动一个单元格的费用为1,总费用为所有棋子的移动费用之和.求最 ...
最新文章
- JS对象直接量,数组直接量和函数直接量
- 2014-04-03研究笔记整理
- 快快: 一点即玩的游戏客户端平台
- 【Eclipse中使用Git之一】把远程仓库的项目,clone到eclipse里面
- 差分约束 1:pku 1201 Intervals 2:pku 1364 King 3:hdu 1534
- 导出Excel表格时,如何把数据库表中的编号转换成配置文件中的汉字
- Android Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE解决办法
- 普通类和抽象类有哪些区别?
- background相关属性
- 数据是否服从正态分布
- 硅谷初创企业控制成本 裁员风渐起
- CAN FD:测量和重编程
- python打开读取文件内容
- tomcat 虚拟目录配置appBase和docBase的区别
- CTF Crypto/MISC 在线工具网站
- 往事依稀浑似梦 都随风雨到心头 ——OI回忆录
- mybatis框架实现一对多、多对多关系查询,以及递归查询(单表多级分类:省市区三级地址查询)
- 二元函数可微与可导的关系_函数连续、可导与可微之间的关系
- 超市销售数据分析python_基于Python的超市O2O营销数据分析
- 京东智能供应链决策引擎全面开放;LinkedIn开源Dagli,发布Java机器学习函数库...