【HDU 2853】 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853
题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现在要你重新给每个公司分配一个任务(一个任务只能分配给一家公司),使得所有公司任务的效率值最大,并且改变的原始任务最少。
思路:把每条边的权值扩大k倍(k>n),然后属于原始任务的边权值+1,权值加1是为了当两条边权值相同时,更优先选择属于原始任务的边,扩大k倍的巧妙之处不仅在于KM匹配时优先选择原始边所得答案除k得到原始答案,而且结果对k求余就是保留的就是原始任务的数量。
这种题对思维要求太高了,想不到 T.T
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; const int maxn=;
const int oo=1e9;
int lx[maxn], ly[maxn], vx[maxn], vy[maxn], match[maxn], slack[maxn];
int map[maxn][maxn];
int n, m; bool find(int i)
{
vx[i]=; ///相等子图中X集合
for(int j=; j<=m; j++)
if(!vy[j])
{
int t=lx[i]+ly[j]-map[i][j];
if(t==) ///当这条边在相等子图中
{
vy[j]=; ///相等子图中Y集合
if(match[j]==-||find(match[j]))
{
match[j]=i;
return true;
}
}
else slack[j]=min(slack[j],t);
}
return false;
} int KM()
{
int ans=;
memset(match,-,sizeof(match));
memset(ly,,sizeof(ly));
for(int i=; i<=n; i++)
{
lx[i]=-oo;
for(int j=; j<=m; j++)
lx[i]=max(lx[i],map[i][j]); ///顶标lx初始化保存的是连接i节点的最大边权值
}
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++) slack[j]=oo;
while()
{
memset(vx,,sizeof(vx));
memset(vy,,sizeof(vy));
if(find(i)) break;
int d=oo;
for(int j=; j<=m; j++)
if(!vy[j]) d=min(d,slack[j]);
for(int j=; j<=n; j++)
if(vx[j]) lx[j]-=d;
for(int j=; j<=m; j++)
if(vy[j]) ly[j]+=d;
for(int j=; j<=m; j++) slack[j]-=d;
}
}
for(int i=; i<=m; i++)
if(match[i]!=-) ans+=map[ match[i] ][i];
return ans;
} int main()
{
while(cin >> n >> m)
{
for(int i=; i<=n; i++)
for(int j=; j<=m; j++) map[i][j]=-oo;
for(int i=; i<=n; i++)
for(int j=; j<=m; j++)
{
int c;
scanf("%d",&c);
map[i][j]=max(map[i][j],*c);
}
int sum=;
for(int i=,j; i<=n; i++)
{
scanf("%d",&j);
sum+=map[i][j]/;
map[i][j]+=;
}
int ans=KM();
printf("%d %d\n",n-ans%,ans/-sum);
}
return ;
}
【HDU 2853】 KM算法的更多相关文章
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU 2255 KM算法 二分图最大权值匹配
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 2448(KM算法+SPFA)
Mining Station on the Sea Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 2853 (KM最大匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题目大意:二分图匹配费用流.①最大匹配②最小原配变动 解题思路: 如果去掉第二个要求,那么就是裸 ...
- hdu 4862 KM算法 最小K路径覆盖的模型
http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...
- HDU 1533 KM算法(权值最小的最佳匹配)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 3435(KM算法最优匹配)
A new Graph Game Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 1853 KM算法
#include<stdio.h> #include<math.h> #include<string.h> #define N 200 #define inf 99 ...
- hdu 2853 Assignment KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...
随机推荐
- hdu1520 Anniversary party (树形dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1520题意:上司和直系下属不能同时参加party,求party的最大活跃值.输入: 输入n个 ...
- DSP using MATLAB 示例Example2.3
n = [-10:1:10]; alpha = -0.1+0.3j; % x = exp(alpha*n); % subplot(2,1,1); set(gcf,'Color',[1,1,1]) % ...
- javascript优化--11模式(设计模式)02
策略模式 在选择最佳策略以处理特定任务(上下文)的时候仍然保持相同的接口: //表单验证的例子 var data = { firs_name: "Super", last_name ...
- php,blade语法
打印数组 <?php print_r($agreement);die?> <?= ?><?php echo ?><?php printf();die;?> ...
- 后缀数组 POJ 2406 Power Strings
题目链接 题意:连续重复子串.给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的(L = S^R ), 求 R 的最大值. 分析:枚举长度,判断条件是能被总长度整除且LCP ( ...
- My97DatePicker控件
本文只做了功能说明,详细请看http://www.my97.net/dp/demo/index.htm 二. 功能及示例 1. 常规功能 支持多种调用模式 除了支持常规在input单击或获得焦点调用外 ...
- debug note-- nginx php-fpm : Error:The page you are looking for is temporarily unavailable.
1.在ubuntu下安装配置nginx, mysql, php 安装步骤: 参考:https://www.digitalocean.com/community/tutorials/how-to-ins ...
- SQLite错误码
在SQLite中,执行SQL语句的sqlite3_exec()和sqlite3_prepare()两个核心方法的返回值都是一个整型数据,因此,当程序执行出现错误时,我们可以根据执行返回的整型数据来判断 ...
- BZOJ4386 : [POI2015]Wycieczki
将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理. 时间复杂度$O(n^3\log k)$. #include<cstdio& ...
- Node.js学习
1. 下载 网址:https://nodejs.org/download/ 2. 添加express框架 如下图,运行Node.js command prompt 在命令行中输入:npm instal ...