原文链接http://www.cnblogs.com/zhouzhendong/p/8284105.html


题目传送门 - HDU2853


题意概括

(来自谷歌翻译)


题解

  这是一道好题。

  我们首先把所有边权都乘上(n+1)。

  然后对于原来就有的边,我们再+1.

  然后跑一跑KM,利用的原边数就是ans%(n+1),最终方案的效果就是ans/(n+1)

  为什么是对的?

  考虑1和n+1差距很大。

  事实上,原来的边权看作第一关键字,然后是否选用原边看作第二关键字,然后通过给第一关键字乘一个较大的数来巧妙的KM求解。


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=55,Inf=1e9+7;
int n,m,g[N][N],ex[N],ey[N],match[N],minadd[N];
bool visx[N],visy[N];
bool Match(int x){
visx[x]=1;
for (int i=1;i<=m;i++)
if (!visy[i]){
int add=ex[x]+ey[i]-g[x][i];
if (!add){
visy[i]=1;
if (!match[i]||Match(match[i])){
match[i]=x;
return 1;
}
}
else
minadd[i]=min(minadd[i],add);
}
return 0;
}
int KM(){
memset(match,0,sizeof match);
memset(ey,0,sizeof ey);
for (int i=1;i<=n;i++){
ex[i]=g[i][1];
for (int j=2;j<=m;j++)
ex[i]=max(ex[i],g[i][j]);
}
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++)
minadd[j]=Inf;
while (1){
memset(visx,0,sizeof visx);
memset(visy,0,sizeof visy);
if (Match(i))
break;
int delta=Inf;
for (int j=1;j<=m;j++)
if (!visy[j])
delta=min(delta,minadd[j]);
for (int j=1;j<=n;j++)
if (visx[j])
ex[j]-=delta;
for (int j=1;j<=m;j++)
if (visy[j])
ey[j]+=delta;
else
minadd[j]-=delta;
}
}
int ans=0;
for (int i=1;i<=m;i++)
if (match[i])
ans+=g[match[i]][i];
return ans;
}
int main(){
while (~scanf("%d%d",&n,&m)){
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++){
scanf("%d",&g[i][j]);
g[i][j]*=n+1;
}
int pre_val=0;
for (int i=1,x;i<=n;i++){
scanf("%d",&x);
pre_val+=g[i][x]/(n+1);
g[i][x]++;
}
int ans=KM();
printf("%d %d\n",n-ans%(n+1),ans/(n+1)-pre_val);
}
return 0;
}

  

HDU2853 Assignment KM的更多相关文章

  1. hdu 2853 Assignment KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...

  2. HDU-2853 Assignment

    求二分最大匹配,但还要尽量接近原匹配... 解决方法:对于N个顶点的二分图,每条边同时乘上一个比N稍微大的数N',然后对于在原匹配的边就都+1. 经过这样处理,求得的答案Ans乘除N'即是原图的最大匹 ...

  3. hdu2853 Assignment 完美匹配 多校联赛的好题

    PS:好题.不看题解绝对AC不了. 题解来源: http://blog.csdn.net/niushuai666/article/details/7176290 http://www.cnblogs. ...

  4. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  5. HDU 2853 Assignment(KM最大匹配好题)

    HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...

  6. Assignment (HDU 2853 最大权匹配KM)

    Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. Assignment HDU - 2853(二分图匹配 KM 新边旧边)

    传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...

  8. HDU 2853 & 剩余系+KM模板

    题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...

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

随机推荐

  1. mybatis:访问静态变量或方法

    访问方法: <if test="@com.csget.constant.ConstantApp@getUser('mobile')== 'kf'"> <![CDA ...

  2. 转载:UML学习(四)-----状态图(silent)

    原文:http://www.cnblogs.com/silent2012/archive/2011/11/01/2178278.html 状态图主要用于描述对象具有的各种状态.状态之间的转换过程以及触 ...

  3. Uva 11178 Morley定理

    题意: 给你三角形三个点, 定理是 三个内角的三等分线相交得出 DEF三点, 三角新 DFE是等边三角形 然后要你输出 D E F 的坐标 思路 : 求出三个内角,对于D 相当于 BC向量逆时针旋转, ...

  4. python学习第16天。

    内置函数是在原本已经有的序列的基础上,再生成新的. List的方是修改原列表. 内置函数中大部分函数的返回值大部分都是迭代器.生成器. Sorted需要遍历操作,不是单纯的迭代,所以不生成迭代器. 一 ...

  5. highcharts之柱状图

    <div class="row"> <div class="col-md-12"> <div id="container ...

  6. Confluence 6 数据中心的缓存

    在 Confluence 数据中心(集群)你需要分布缓存和每一个节点的缓存.在集群管理界面,将会定义分布缓存和节点本地缓存. 缓存配置文件存储在集群共享目录中的 home 目录下面. https:// ...

  7. Confluence 6 home 目录中的内容

    Confluence home 目录存储了 Confluence 在运行中所使用的数据.下面对 Confluence home 目录中使用的数据和文件进行一些说明: confluence.cfg.xm ...

  8. 关于deepin linux15.6-15.9.1系统播放视频卡顿解决办法

    关于deepin linux15.6-15.9.1系统播放视频卡顿解决办法 chrome浏览器 关闭chrome硬件加速模式 设置>高级>使用硬件加速模式 注释:由于视频卡顿是因显卡驱动问 ...

  9. mac 端口占用问题

    查看端口号 终端输入:sudo lsof -i tcp:port 将port换成被占用的端口(如:8086.9998) 将会出现占用端口的进程信息. 杀死占用端口的PID进程 找到进程的PID,使用k ...

  10. 【git】提交代码到远程仓库

    看完不用,就是一个字:忘! 之前学了两天git结果今天要用的时候,啥也想不起来.... 场景: 已有远程仓库: git@192.168.1.1:test/test.git 要提交代码到远程仓库的新分支 ...