HDU 2426 Interesting Housing Problem(二分图最佳匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=2426
题意:
每n个学生和m个房间,现在要为每个学生安排一个房间居住,每个学生对于一些房间有一些满意度,如果满意度为负就说明该学生不喜欢住在这房间。现在问如何安排可以使所有学生的满意度总和最大。(不能将学生安排到他不喜欢的房间或者他没有评价的房间)
思路:
二分图的最佳匹配,注意题目的要求即可。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = +;
const int INF = 0x3f3f3f3f; int n, m, k;
int g[maxn][maxn];
int lx[maxn], ly[maxn];
bool S[maxn], T[maxn]; //记录左右两边节点是否已匹配
int match[maxn];
int slack[maxn]; //差值 bool dfs(int i)
{
S[i] = true;
for (int j = ; j <= m; ++j)
{
if (T[j]) continue; //每一轮匹配,右边节点只能一次
int gap = lx[i] + ly[j] - g[i][j];
if (gap == ) //如果符合要求
{
T[j] = true;
if (match[j] == - || dfs( match[j] ))
{
match[j] = i;
return true;
}
}
else slack[j] = min(slack[j], gap);
}
return false;
} int KM()
{
memset(match, -, sizeof match);
memset(ly, , sizeof ly); //初始化ly为0
for (int i = ; i<=n; i++) //初始化lx[i]为该节点所有边中的最大权值
{
lx[i] = g[i][];
for (int j = ; j<=m; j++)
lx[i] = max(lx[i], g[i][j]);
}
for (int i=; i<=n; i++) //尝试为每个节点匹配节点
{
memset(slack,INF,sizeof(slack)); //因为要取最小值,初始化为无穷大
while (true) {
memset(S, false, sizeof S); //记录每轮匹配中左右节点是否被尝试匹配过
memset(T, false, sizeof T);
if (dfs(i)) break;
int d = INF;
for (int j=; j<=m; j++)
if (!T[j]) d = min(d, slack[j]);
for (int j=; j<=n; ++j)
if (S[j]) lx[j] -= d;
for(int j=;j<=m;j++)
{
if (T[j]) ly[j] += d;
else slack[j] -= d;
}
}
} int result = ,flag=;
for(int i = ; i <=m; i++){
if(match[i]==-||g[match[i]][i]==-INF)
continue;
if(match[i]>-){
result += g[match[i]][i];
flag++;
}
}
if(flag<n) result=-;
return result; } int main()
{
//freopen("in.txt","r",stdin);
int cas = ;
while(~scanf("%d%d%d",&n,&m,&k))
{
if(n>m)
{
printf("Case %d: %d\n", ++cas, -);
continue;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
g[i][j] = -INF;
for(int i=;i<k;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u++; v++;
if(w>=) g[u][v] = w;
}
int ans = KM();
printf("Case %d: %d\n", ++cas, ans);
}
return ;
}
HDU 2426 Interesting Housing Problem(二分图最佳匹配)的更多相关文章
- hdu 2426 Interesting Housing Problem 最大权匹配KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2426 For any school, it is hard to find a feasible ac ...
- HDU 2426 Interesting Housing Problem (最大权完美匹配)【KM】
<题目链接> 题目大意: 学校里有n个学生和m个公寓房间,每个学生对一些房间有一些打分,如果分数为正,说明学生喜欢这个房间,若为0,对这个房间保持中立,若为负,则不喜欢这个房间.学生不会住 ...
- HDU 3315 My Brute(二分图最佳匹配+尽量保持原先匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=3315 题意: 有S1到Sn这n个勇士要和X1到Xn这n个勇士决斗,初始时,Si的决斗对象是Xi. 如果Si赢了X ...
- HDU2255 奔小康赚大钱【二分图最佳匹配】
题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...
- hdu3488 Tour 拆点+二分图最佳匹配
In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way r ...
- hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...
- hdu 2063 过山车(二分图最佳匹配)
经典的二分图最大匹配问题,因为匈牙利算法我还没有认真去看过,想先试试下网络流的做法,即对所有女生增加一个超级源,对所有男生增加一个超级汇,然后按照题意的匹配由女生向男生连一条边,跑一个最大流就是答案( ...
- HDU 2255 二分图最佳匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 2255 二分图最佳匹配 模板题
题目大意: 给定每一个人能支付的房子价值,每个人最多且必须拥有一套房子,问最后分配房子可得到的最大收益 抄了个别人的KM模板,就这样了... #include <cstdio> #incl ...
随机推荐
- 安卓apk的编译与反编译
原文:https://blog.csdn.net/baidu_33870664/article/details/80186945 android基于java的,而java反编译工具很强悍,所以对正常a ...
- GJP_Project
1. view层作用: 视图层,即项目中的界面 l controller层作用: 控制层, 获取界面上的数据,为界面设置数据; 将要实现的功能交给业务层处理 l service层作用: 业务层, ...
- 【封装函数】当前元素距离html文档顶部距离
function getPositionTop(node) { var top = node.offsetTop; var parent = node.offsetParent; while(pare ...
- (Review cs231n) The Gradient Calculation of Neural Network
前言:牵扯到较多的数学问题 原始的评分函数: 两层神经网络,经过一个激活函数: 如图所示,中间隐藏层的个数的各数为超参数: 和SVM,一个单独的线性分类器需要处理不同朝向的汽车,但是它并不能处理不同颜 ...
- Linux基础命令---apwatch
arpwatch arpwatch指令可以监听网络设备和ip地址的对应关系,将发现的信息发送到系统日志“/var/log/message”. 此命令的适用范围:RedHat.RHEL.Ubu ...
- SQL8数据库定期自动备份
我们知道,利用SQL Server 2008数据库可以实现数据库的定期自动备份.方法是用SQL SERVER 2008自带的维护计划创建一个计划对数据库进行备份, 下面我们将SQL SERVER 20 ...
- webpack处理媒体文件(图片/视频和音频)
webpack最终会将各个模块打包成一个文件,因此我们样式中的url路径是相对入口html页面的, 这个问题是用file-loader解决的,file-loader可以解析项目中的url引入(不仅限于 ...
- SQL注入(dvwa环境)
首先登录DVWA主页: 1.修改安全级别为LOW级(第一次玩别打脸),如图中DVWA Security页面中. 2.进入SQL Injection页面,出错了.(心里想着这DVWA是官网下的不至于玩不 ...
- Golang利用select实现超时机制
所谓超时,比如上网浏览一些安全的网站,如果几分钟之后不做操作,那么就会让你重新登录.就所谓有时候出现goroutine阻塞的情况,那么我们如何避免整个程序进入阻塞情况,这时候就可以用select来设置 ...
- P4316 绿豆蛙的归宿(期望)
P4316 绿豆蛙的归宿 因为非要用bfs所以稍微麻烦一点qwq(大家用的都是dfs) 其实问题让我们求的就是经过每条边的概率*边权之和 我们可以用bfs把图遍历一遍处理概率,顺便把每条边的概率*边权 ...