HDU 2255 KM算法—模板
来源:互联网 发布:linux fork多个子进程 编辑:程序博客网 时间:2024/05/22 15:27
代码转自kuangbin博客:http://www.cnblogs.com/kuangbin/p/3228861.html
题目:
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。
这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。
另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(当然是在他们的经济范围内).现在这个问题就是村领导怎样分配房子才能使收入最大.(村民即使有钱购买一间房子但不一定能买到,要看村领导分配的).
这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。
另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(当然是在他们的经济范围内).现在这个问题就是村领导怎样分配房子才能使收入最大.(村民即使有钱购买一间房子但不一定能买到,要看村领导分配的).
2100 1015 23
123
代码:
//二分图的最大加权匹配算法模板,转自kuangbin//http://www.cnblogs.com/kuangbin/p/3228861.html#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define INF 0x3f3f3f3fusing namespace std;int nx,ny; //表示二分图两部分的点数,此题中nx=ny=nint Map[305][305];int link[305],lx[305],ly[305]; //分别表示y中各点匹配状态,x,y中的点标号int slack[305];bool visx[305],visy[305];int n;bool DFS(int x) //通过DFS进行增广{ visx[x] = true; for(int y = 0; y < n; y++) { if(visy[y]) continue; int tmp = lx[x] + ly[y] - Map[x][y]; if(tmp == 0) { visy[y] = true; if(link[y] == -1 || DFS(link[y])) { link[y] = x; return true; } } else if(slack[y] > tmp) slack[y] = tmp; } return false;}int KM(){ memset(link,-1,sizeof(link)); memset(ly,0,sizeof(ly)); for(int i = 0; i < n; i++) { lx[i] = -INF; for(int j = 0; j < n; j++) if(Map[i][j] > lx[i]) lx[i] = Map[i][j]; } for(int x = 0; x < n; x++) { for(int i = 0; i < n; i++) //通过记录松弛量,优化 slack[i] = INF; while(1) { memset(visx,false,sizeof(visx)); memset(visy,false,sizeof(visy)); if(DFS(x))break; int d = INF; for(int i = 0; i < n; i++) if(!visy[i] && d > slack[i]) d = slack[i]; for(int i = 0; i < n; i++) if(visx[i]) lx[i] -= d; for(int i = 0; i < n; i++) { if(visy[i]) ly[i] += d; else slack[i] -= d; } } } int res = 0; for(int i = 0;i < n;i++) if(link[i] != -1) res += Map[link[i]][i]; return res;}int main(){ while(scanf("%d",&n) != EOF) { for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) scanf("%d",&Map[i][j]); printf("%d\n",KM()); } return 0;}
阅读全文
0 0
- HDU 2255 KM算法—模板
- hdu 2255KM算法模板
- hdu 2255(KM算法模板)
- 【KM算法 模板】HDU
- hdu 2255(KM算法模板)
- hdu-2255(KM算法模板)
- KM算法模板(HDU 2255)
- HDU 2255 KM算法
- HDU 2255 (KM()算法)
- HDU-2255(KM算法)
- 【HDU 2255】【KM算法模板题+KM算法详解】 奔小康赚大钱
- hdu 2255 奔小康赚大钱--KM算法模板
- hdu 2255 奔小康赚大钱 KM算法 模板题
- hdu 2255 二分图最大权匹配 km算法模板
- hdu 2255奔小康赚大钱 KM算法模板
- HDU 2255 奔小康赚大钱 (KM算法 模板)
- HDU 2255 奔小康赚大钱 (KM算法 模板题)
- HDU 2255 奔小康赚大钱(KM算法模板题)
- 【poj 1679】The Unique MST 【次小生成树 模板】
- 明远智睿i.MX6开发板EK200捡漏之二:RTC时间修改
- Win10 Microsoft IME是什么进程?占用CPU高如何解决?
- (3)基础学习:渲染
- JAVA面试积累1
- HDU 2255 KM算法—模板
- Linux基础
- 学习虫师的《web接口开发与自动化测试》第六章
- 基于深度学习的OCR-from 美團技術團隊
- Sum of Square Numbers问题描述
- CodeForces 311B/CSU 1963 Cats Transport/Feed The Rabbit(斜率优化dp)
- ssm(Mysql)+Redis的Demo
- 暑期学习记录03
- EXCEL排序