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 ...
随机推荐
- redis常见应用场景
redis应用场景总结redis平时我们用到的地方蛮多的,下面就了解的应用场景做个总结: 1.热点数据的缓存 由于redis访问速度块.支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另 ...
- [转]Hive开发经验问答式总结
本文转载自:http://www.crazyant.net/1625.html 本文是自己开发Hive经验的总结,希望对大家有所帮助,有问题请留言交流. Hive开发经验思维导图 Hive开发经验总结 ...
- RocketMQ 问题汇总
1. rocketMQ安装: 编译完成以后准备启动项目,注意:bin的位置是编译后target目录下,启动命令在这里. linux命令目录:你的目录/rocketmq-all-4.2.0/distri ...
- POJ 1789 Truck History (Kruskal 最小生成树)
题目链接:http://poj.org/problem?id=1789 Advanced Cargo Movement, Ltd. uses trucks of different types. So ...
- 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition) (优先队列)
题目链接:http://abc042.contest.atcoder.jp/tasks/abc042_b Time limit : 2sec / Memory limit : 256MB Score ...
- Nginx配置服务器静态文件支持跨域访问
在server中配置 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Reque ...
- Struts2 的 配置
三.Struts2配置 Struts2的核心配置文件 1.名称和位置是固定的 在src下struts.xml 2.Struts根标签 Package Action Result Action Pa ...
- selenium得到弹出窗口
# 获取当前的页面窗口 first_handle = brower.current_window_handle handles = brower.window_handles for i in han ...
- 获取RadioButton选中的值
1.RadioButtonList的RepeatDirection="Horizontal"可以设置按扭选项横对齐: 2.获取选中的RadioButton值; $("#& ...
- 线程同步——用户模式下线程同步——Slim读写锁实现线程同步
//Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...