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(二分图最佳匹配)的更多相关文章

  1. 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 ...

  2. HDU 2426 Interesting Housing Problem (最大权完美匹配)【KM】

    <题目链接> 题目大意: 学校里有n个学生和m个公寓房间,每个学生对一些房间有一些打分,如果分数为正,说明学生喜欢这个房间,若为0,对这个房间保持中立,若为负,则不喜欢这个房间.学生不会住 ...

  3. HDU 3315 My Brute(二分图最佳匹配+尽量保持原先匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=3315 题意: 有S1到Sn这n个勇士要和X1到Xn这n个勇士决斗,初始时,Si的决斗对象是Xi. 如果Si赢了X ...

  4. HDU2255 奔小康赚大钱【二分图最佳匹配】

    题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2255 题目大意: 村里要分房子. 有N家老百姓,刚好有N间房子.考虑到每家都要有房住,每家必须分配 ...

  5. hdu3488 Tour 拆点+二分图最佳匹配

    In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one-way r ...

  6. hdu2255 奔小康赚大钱 二分图最佳匹配--KM算法

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住 ...

  7. hdu 2063 过山车(二分图最佳匹配)

    经典的二分图最大匹配问题,因为匈牙利算法我还没有认真去看过,想先试试下网络流的做法,即对所有女生增加一个超级源,对所有男生增加一个超级汇,然后按照题意的匹配由女生向男生连一条边,跑一个最大流就是答案( ...

  8. HDU 2255 二分图最佳匹配

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. HDU 2255 二分图最佳匹配 模板题

    题目大意: 给定每一个人能支付的房子价值,每个人最多且必须拥有一套房子,问最后分配房子可得到的最大收益 抄了个别人的KM模板,就这样了... #include <cstdio> #incl ...

随机推荐

  1. Linux服务器---流量监控bandwidthd

    Bandwidthd Bandwidthd是一款免费的流量监控软件,它可以用图标的方式展现出网络流量行为,并且可区分出ftp.tcp等各种协议的流量. 1.安装一些依赖软件 [root@localho ...

  2. 转:WCF传送二进制流数据基本实现步骤详解

    来自:http://developer.51cto.com/art/201002/185444.htm WCF传送二进制流数据基本实现步骤详解 2010-02-26 16:10 佚名 CSDN   W ...

  3. 转:Image与byte之间互转

    #region<Image 与 byte之间互转> /// <summary> /// 将一个byte转换成一个Bitmap对象 /// </summary> // ...

  4. centos6.8卸载DB2 10.5

    1.卸载实例 Ø  使用Root用户登陆 cd /opt/ibm/db2/V9.5/instance/ ./db2idrop db2inst1 ./dasdrop db2inst1 2.卸载db2 Ø ...

  5. ptrace线程

    在ptrace时使用waitpid(-1, &status, 0);无法正常trace 修改为waitpid(-1, &status, __WALL);即可 原因是:

  6. scss简单用法

  7. flask框架----flask-script组件

    Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...

  8. EDK II之USB总线驱动的实现框架

    本文简单介绍一下UEFI中USB驱动的实现框架: 下图是USBD向上层驱动提供的接口: 1.从图中我们可以看出,USBDI的实现主要通过调用HCDI实现 和 访问USB_INTERFACE结构体(该结 ...

  9. php中通过Hashids将整数转化为唯一字符串

    这个类主要是前台显示的主键ID转化成一串无规律的字符串,比较像 Youtube.Youku.Weibo之类的 id 名,从某种意义上可以防采集 在项目中,暴露给用户真实的项目ID,很有可能被恶意采集, ...

  10. PyCharm配置MySQL

    有时候电脑没有安装Navicat,也想要操作数据库,那么PyCharm也能实现Navicat的一些功能.下面演示,用PyCharm如何连接数据库并执行操作: 1. 打开PyCharm,在右侧边栏打开D ...