Interesting Housing Problem HDU - 2426 (KM)
Interesting Housing Problem
HDU - 2426
题意:n个人,m个房间,安排住宿。要求每个人不能分到不喜欢的房间,且使满意度最大。
不用slack几乎要超时~
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxn=550; 5 6 int c[maxn][maxn]; 7 int vb[maxn],vg[maxn],eb[maxn],eg[maxn]; 8 int mc[maxn]; 9 int slack[maxn]; 10 int n,m,r; 11 12 int dfs(int id){ 13 vg[id]=1; 14 for(int i=0;i<m;i++){ 15 int gap=eg[id]+eb[i]-c[id][i]; 16 if(vb[i]) continue; 17 if(gap==0){ 18 vb[i]=1; 19 if(mc[i]==-1||dfs(mc[i])){ 20 mc[i]=id; 21 return 1; 22 } 23 } 24 else slack[i]=min(slack[i],gap); 25 } 26 return 0; 27 } 28 29 int KM() 30 { 31 memset(mc,-1,sizeof(mc)); 32 memset(eb,0,sizeof(eb)); 33 for(int i=0;i<n;i++){ 34 eg[i]=c[i][0]; 35 for(int j=1;j<m;j++) 36 eg[i]=max(eg[i],c[i][j]); 37 } 38 39 for(int i=0;i<n;i++){ 40 memset(slack,inf,sizeof(slack)); 41 while(1){ 42 memset(vb,0,sizeof(vb)); 43 memset(vg,0,sizeof(vg)); 44 if(dfs(i)) break; 45 int d=inf; 46 for(int j=0;j<m;j++) if(!vb[j]) d=min(d,slack[j]); 47 if(d==inf) return -1; 48 for(int j=0;j<n;j++) if(vg[j]) eg[j]-=d; 49 for(int j=0;j<m;j++) 50 if(vb[j]) eb[j]+=d; 51 else slack[j]-=d; 52 } 53 } 54 int ans=0; 55 for(int i=0;i<m;i++){ 56 if(mc[i]!=-1){ 57 if(c[mc[i]][i]!=-inf) ans+=c[mc[i]][i]; 58 else return -1; 59 } 60 } 61 return ans; 62 } 63 64 int main(){ 65 int u,v,w; 66 int kase=0; 67 while(scanf("%d%d%d",&n,&m,&r)!=EOF){ 68 for(int i=0;i<n;i++) 69 for(int j=0;j<m;j++) 70 c[i][j]=-inf; 71 for(int i=0;i<r;i++){ 72 scanf("%d%d%d",&u,&v,&w); 73 if(w>=0) c[u][v]=w; 74 } 75 printf("Case %d: %d\n",++kase,KM()); 76 } 77 }
slack
转载于:https://www.cnblogs.com/yijiull/p/7389644.html
Interesting Housing Problem HDU - 2426 (KM)相关推荐
- Hdu 1533(KM算法)
Hdu 1533 (1)思路: KM算法模板题, 将每个人到家的距离求出来, 求出最小的距离,所以可以将距离变为负数,然后求出负数的最大值,就是正数的最小值. (2)代码: #include<i ...
- hdu 2224(dp)
hdu 2224 (1)题意: 从1找一条到n的路径(路径上的前一个节点的编号小于后一个节点的编号), 然后找一条从n到1的路径,(路径上的前一个节点的编号大于后一个节点的编号)要求这两条路径遍历所有 ...
- hdu 3488(uva 1349)(KM)
这道题是uva 1349 的简化版,那题没过,不知道为什么.我觉得那题就是多了一个先判断他最大匹配数是不是n,是的话,再找最优匹配. 回到这题,匹配问题,又是有向图,直接想到了拆点法.然后发现若每个点 ...
- hdu 5055(坑)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5055 Bob and math problem Time Limit: 2000/1000 MS (J ...
- Entity Framework Unit Testing problem and solution(转)
其实下文中说的解决方案不仅仅适用于应用了Ef的项目,其它涉及数据访问的测试同样适用. 不说先贴上原文链接 : (一) http://graemehill.ca/unit-testing-an-enti ...
- HDU 4545 (模拟) 魔法串
题目链接 Problem Description 小明和他的好朋友小西在玩一个新的游戏,由小西给出一个由小写字母构成的字符串,小明给出另一个比小西更长的字符串,也由小写字母组成,如果能通过魔法转换使小 ...
- A+B Problem _ C++(嘿嘿)
题目背景 作为所有编程语言的最"难"(一点也不难是假的)的一道题,曾近难倒了许多"大佬",本次提供几种"简单"算法(嘿嘿): 题目描述 a+ ...
- hdu 5534(dp)
Input The first line contains an integer T indicating the total number of test cases. Each test case ...
- hdu 4196(数论)
题意:问小于n的数的乘积能拼成的最大平方数是多少? 思路:给n!做质数分解在除去指数为奇数的那些质数,由于题目中需要模运算所以不能直接除,必须乘上摸逆. 代码如下: 1 /************** ...
- [KM算法]hdoj 2426:Interesting Housing Problem
大致题意: 有n个小孩要去m间屋子,每间屋子只能住一个人.每个小孩都会对一些屋子打分.已知每个小孩不能去那些他打负分和没打分的屋子,求安排住宿后所有人对自己屋子打分之和最大值是多少. 大致思路: KM ...
最新文章
- C# 移动鼠标方法
- 偏差-方差权衡的理解
- delphi 读取ini所有项_财务机器人真的会代替财务人员所有工作吗?
- 物理学家杨振宁到底有多厉害?
- Windbg SOS and CLR版本不一致的解决方案
- Apache重定向方法实现图片防盗链
- Mina Protocol将主网候选版本发布时间延后一小时至3月17日8点
- 《推荐系统笔记(五)》svd降维 —— 以图片处理为例
- Node.js:Node模块简介
- matlab 同态滤波
- 使用STM32的I2S协议读取麦克风INMP441
- DEDECMS5.7自动采集更新伪原创插件高级版GBK
- 2017最新版《土地利用现状分类》GBT 21010-2017
- 数据库表插入中文数据时报错Incorrect string value: ‘\xE4\xBB\x8E\xE5\x85\xA5...‘ for column ‘name‘ at r
- 23.2、Android -- OkHttp3 基础学习 自定义设置
- 航弈单通道脑电设备通过lsl在Matlab中接收数据
- 代码中的软件工程:正则表达式十步通关
- 二分法解具有单调性的方程
- 【热门书籍】温度决定生老病死 作者:马悦凌
- pyqt5以及pyqtgraph(pyqt界面设计绘图)