hdu2853 Assignment 完美匹配 多校联赛的好题
PS:好题。不看题解绝对AC不了。
题解来源:
http://blog.csdn.net/niushuai666/article/details/7176290
http://www.cnblogs.com/wally/archive/2013/04/02/2995846.html
题目大意:
现在有N个部队和M个任务(M>=N),每个部队完成每个任务有一点的效率,效率越高越好。但是部队已经安排了一定的计划,这时需要我们尽量用最小的变动,使得所有部队效率之和最大。求最小变动的数目和变动后和变动前效率之差。
分析:
因为我们要变动最小,所以对在原计划中的边要有一些特殊照顾,使得最优匹配时,尽量优先使用原计划的边,这样变化才能是最小的且不会影响原匹配。
根据这个思想,我们可以把每条边的权值扩大k倍,k要大于n。然后对原计划的边都+1。精华全在这里。我们来详细说明一下。
全部边都扩大了k倍,而且k比n大,这样,我们求出的最优匹配就是k倍的最大权值,只要除以k就可以得到最大权值。实现原计划的边加1,这样,在每次选择边时,这些变就 有了优势,就会优先选择这些边。假如原计划的h条边被选入了最优匹配中,这样,最优权值就是k倍的最大权值+k(原计划的每条边都+1)。但是k大于n的用意何在呢?我们发现假如原计划的边全部在匹配中,只会增加n,又n<k,所以除以k后不会影响最优匹配的最大权值之和,然后我们对k取余,就正好得到加入的原计划的边的个数。这时,我们只需要用总点数-加入的原计划的点数,就可以求得最小变动数了。
代码:(其实知道上面的题解,根本不用看代码)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=, INF=0x3f3f3f3f;
int Map[N][N],mat1[N],mat2[N];//匹配上的左右集合
int KM(int m,int n)
{
int s[N],t[N],a[N],b[N];
int i,j,k,p,q,ans=;
for(i=;i<m;i++)
{
a[i]=-INF;
for(j=;j<n;j++)
a[i]=Map[i][j]>a[i]?Map[i][j]:a[i];
if(a[i]==-INF) return -;//cannot match
}
memset(b,,sizeof(b));
memset(mat1,-,sizeof(mat1));
memset(mat2,-,sizeof(mat2));
for(i=;i<m;i++)
{
memset(t,-,sizeof(t));
p=q=;
for(s[]=i;p<=q&&mat1[i]<;p++)
{
for(k=s[p],j=;j<n&&mat1[i]<;j++)
{
if(a[k]+b[j]==Map[k][j]&&t[j]<)
{
s[++q]=mat2[j]; t[j]=k;
if(s[q]<)
for(p=j;p>=;j=p)
{
mat2[j]=k=t[j];p=mat1[k]; mat1[k]=j;
}
}
}
}
if(mat1[i]<)
{
i--,p=INF;
for(k=;k<=q;k++)
{
for(j=;j<n;j++)
if(t[j]<&&a[s[k]]+b[j]-Map[s[k]][j]<p)
p=a[s[k]]+b[j]-Map[s[k]][j];
}
for(j=;j<n;j++) b[j]+=t[j]<?:p;
for(k=;k<=q;k++) a[s[k]]-=p;
}
}
for(i=;i<m;i++) ans+=Map[i][mat1[i]];
return ans;
}
int p[N];
int main()
{
//freopen("test.txt","r",stdin);
int n,i,j,m,k,e,t,ans,s;
while(scanf("%d%d",&n,&m)!=EOF)
{
e=n;
for(i=;i<n;i++)
for(j=;j<m;j++){
scanf("%d",&Map[i][j]);
Map[i][j]*=;
}
s=;
for(i=;i<n;i++){
scanf("%d",&p[i]);
p[i]--;
s+=Map[i][p[i]]/;
Map[i][p[i]]++;
}
ans=KM(n,m);
t=ans%;
ans/=;
printf("%d %d\n",n-t,ans-s);
}
return ;
}
hdu2853 Assignment 完美匹配 多校联赛的好题的更多相关文章
- ZOJ-3933 Team Formation (二分图最佳完美匹配)
题目大意:n个人,分为两个阵营.现在要组成由若干支队伍,每支队伍由两个人组成并且这两个人必须来自不同的阵营.同时,每个人都有m个厌恶的对象,并且厌恶是相互的.相互厌恶的人不能组成一支队伍.问最多能组成 ...
- UVA 11383 Golden Tiger Claw(最佳二分图完美匹配)
题意:在一个N*N的方格中,各有一个整数w(i,j),现在要求给每行构造row(i),给每列构造col(j),使得任意w(i,j)<=row(i)+col(j),输出row(i)与col(j)之 ...
- UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi ...
- UVALive 2238 Fixed Partition Memory Management(二分完美匹配)
题意:计算机中有一些固定大小的内存,内存越大,处理速度越快.对于一个程序,加入不同的内存空间,处理所需时间不同.现给出m个内存空间,n个程序,对于每个程序程序,有k组数据(s,t),分别表示当程序 i ...
- UVALive 4043 Ants(二分图完美匹配)
题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...
- POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
题意 有n个女生和n个男生,给定一些关系表示男生喜欢女生(即两个人可以结婚),再给定一个初始匹配,表示这个男生和哪个女生结婚,初始匹配必定是合法的.求每个男生可以和哪几个女生可以结婚且能与所有人不发生 ...
- bzoj 1059 [ZJOI2007]矩阵游戏(完美匹配)
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2993 Solved: 1451[Submit][Stat ...
- codevs 1222 信与信封问题(二分图的完美匹配)
1222 信与信封问题 题目描述 Description John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出.但是,第二天John的儿子Small John将这n封信都拿出了信封. ...
- UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)
UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
随机推荐
- 记录:Ubuntu下安装SQL Developer
安装JDK. 用的Ubuntu18.04,已经自带JDK了. 下载SQL Developer. 官网链接:http://www.oracle.com/technetwork/developer-too ...
- 用doxygen风格注释代码生成文档
目录 用doxygen风格注释代码生成文档 1. 说明 2. 具体操作 2.1 生成头部注释 2.2 安装doxygen 2.3 工程配置 3. 总结 用doxygen风格注释代码生成文档 1. 说明 ...
- matlab读取mysql数据
conn = database('ci_bootstrap_3','root','1q1q1q1q','com.mysql.jdbc.Driver','jdbc:mysql://localhost:3 ...
- C#第十四节课
函数的调用 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System ...
- 如何快速从数据库获取表属性编写JavaBean
以前自己对子设计好的数据库将数据库中的表转换为JavaBean,自己还一个一个慢慢打效率真是低,还是老师比较聪明学习学习. 我用的数据库可视化工具是Navicat Premium.UltraEdit( ...
- 论vue项目api相关代码的组织方式
论vue项目api相关代码的组织方式 看了下项目组同事的代码,发现不同项目有不同的组织版本 版本一: ├─apis │ a.api.js │ b.api.js │ b.api.js │ d.api.j ...
- 《奋斗吧!菜鸟》 第八次作业:Alpha冲刺 Scrum meeting 5
项目 内容 这个作业属于哪个课程 任课教师链接 作业要求 https://www.cnblogs.com/nwnu-daizh/p/11012922.html 团队名称 奋斗吧!菜鸟 作业学习目标 A ...
- delphi窗口的create和free,一个古老的话题
窗体分为模式窗体和无模式窗体. 模式窗体在创建窗口创建和释放: begin if not Assigned(FB_Input_JianYanDan) then FB_Input_JianYanDan ...
- EntityFramework:状态变化与方法的关系[转载]
原文地址 一.约定 OnModelCreating 有一些限制需要注意,例如: 1.表名不支持使用标签进行标注 2.最小长度在 OnModelCreating 中不支持 3.正则表达式在 OnMode ...
- Spring MVC-表单(Form)标签-多行文本框(TextArea)示例(转载实践)
以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_textarea.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...