传送门:QAQQAQ

题意:某公司有工作人员x1,x2,…,xn ,他们去做工作y1,y2,…,ym(n<=m) ,每个人都能做其中的几项工作,并且对每一项工作都有一个固定的效率。问能否找到一种合适的工作分配方案,使得总的效率最高。要求一个人只能参与一项工作,同时一项工作也必须由一个人独立完成。不要求所有的人都有工作。

思路:首先让我们明确二分图匹配算法和网络流的区别:二分图KM算法是网络流最小费用最大流中的特例,即KM算法必须满足每一个x点都被匹配才能运行,但两个算法的前提都是在最大匹配的情况下最优,而这道题显然没有要求要最大匹配,所以这两种算法均被否定……(本来想过用最大流做,但发现最大流无法限制x节点只能连一条边)

所以我们要改进KM算法,我们现在要做的是令所有连边都满足最大匹配的前提,这样效率高低就会成为判断方案优劣的唯一因素。(这种控制无关因素的思路值得借鉴)

我们现在把每个人干不了的工作都连上0的边,表示这个人干他干他干不了的工作效率为0,这样每个人和每个工作就都有了边,因为m>=n,所以每个人都可以搜到,再跑一遍KM求答案即可。

(其实这种思路来改进最小费用最大流也可以,但很麻烦,因为网络流中残量网络为0时跑不了)

上代码:

#include<bits/stdc++.h>
using namespace std;
const int N=;
const int M=;
const int inf=(int)2e9; int E[][];
int match[],lx[],ly[],visx[],visy[],slack[],n,m; bool dfs(int u)
{
visx[u]=;
for(int v=;v<=m;v++)
{
if(visy[v]) continue;
if(lx[u]+ly[v]==E[u][v])
{
visy[v]=;
if(match[v]==-||dfs(match[v]))
{
match[v]=u;
return ;
}
}
else
{
slack[v]=min(slack[v],lx[u]+ly[v]-E[u][v]);
}
}
return ;
} void EK()
{
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
for(int x=;x<=n;x++)
{
for(int i=;i<=m;i++) slack[i]=inf;
while(true)
{
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
if(dfs(x)) break;
int Delta=inf;
for(int i=;i<=m;i++) if(!visy[i]) Delta=min(Delta,slack[i]);
for(int i=;i<=n;i++) if(visx[i]) lx[i]-=Delta;
for(int i=;i<=m;i++) if(visy[i]) ly[i]+=Delta;
else slack[i]-=Delta;
}
}
} int main()
{
memset(E,,sizeof(E));
memset(ly,,sizeof(ly));
memset(match,-,sizeof(match)); int k;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
E[x][y]=max(E[x][y],z);
}
for(int i=;i<=n;i++)
{
lx[i]=;
for(int j=;j<=m;j++) lx[i]=max(lx[i],E[i][j]);
}
EK();
int ans=;
for(int i=;i<=m;i++)
{
if(match[i]!=-) ans+=E[match[i]][i];
}
cout<<ans<<endl;
return ;
}

XJOI夏令营501训练1——分配工作的更多相关文章

  1. XJOI夏令营501-511NOIP训练14——好朋友

    传送门:QAQQAQ 题意:noip2011就要来了,W校的同学们不仅看重这次比赛,更看重noip2011和谁住在同一个房间.同学之间的关系好坏可以用一个亲密值表示,亲密值越大,两个同学关系越好.小A ...

  2. XJOI 夏令营501-511NOIP训练18 高二学堂

    在美丽的中山纪念中学中,有座高二学堂,同样也是因为一个人,让它们变 成了现在这个样子~那就是我们伟大的级主任.因为他,我们又迎来了一个木有电影,只有对答案的段考日:又迎来了一个不是大礼拜,而是小礼拜的 ...

  3. XJOI 夏令营501-511NOIP训练18 高三楼

    参观完各种饭堂,学校还有什么著名的景点呢?当然是教室了,此时此刻我 们来到了高三楼.你会发现高三楼门口会有以身份认证系统,这东西还有着一段疼人的历史.每年的九月到来,高三的童鞋大多不习惯学校的作息时间 ...

  4. XJOI 夏令营501-511NOIP训练17 蛇形数阵

    话说小X在孩提时,都会做标准的蛇形矩阵了,发现很好玩.现在的小X很想对其进行改版,变为如下类型的一个无限大蛇形数阵:令S(x)表示以1为左上角,x为右下角的矩形内所有数之和.例如S(12)就是具有深色 ...

  5. XJOI 夏令营501-511NOIP训练14 砍树(2)

    小A是小B家的园丁.小B的家里有n棵树,第i棵树的横坐标为i.一天,小B交给小A一个任务,让他降低自己家中的某些树木的高度.这个任务对小A来说十分简单,因为他有一把极其锋利的斧头和一门独门砍树秘籍,能 ...

  6. LeetCode 最大收益的分配工作

    LeetCode 最大收益的分配工作 工作安排 现在有n位工程师和6项工作(编号为0至5),现在给出每个人能够胜任的工作序号表(用一个字符串表示,比如:045,表示某位工程师能够胜任0号,4号,5号工 ...

  7. XJOI网上同步训练DAY6 T2

    思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...

  8. XJOI网上同步训练DAY6 T1

    思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...

  9. XJOI网上同步训练DAY5 T1

    思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...

随机推荐

  1. Android笔记之调用系统相机拍照

    参考链接: 拍照  |  Android Developers, Android相机拍照方向旋转的解决方案:ExifInterface - 简书 Demo链接:https://pan.baidu.co ...

  2. ubuntu安装更新命令

    ubuntu16.04LTS 进入ubuntu系统后,打开一个终端,如图所示.此时以普通用户身份登录.   由于更新系统需要用到管理员权限,因此要么使用"su -"直接切换到roo ...

  3. arm-linux-ar 和 arm-linux-ranlib 的使用

    静态库是在编译时需要的库. 1. 建立一个静态库 [arm@localhost gcc]#arm­linux­ar ­r libhello.a h1.o h2.o 2. 为静态库建立索引 [arm@l ...

  4. HttpWebRequest请求返回非200的时候 HttpWebResponse怎么接受返回错误提示

    当我们使用HttpWebRequest发送请求的时候如果服务器返回的不是200状态,那么请求代码肯定会异常,其实请求和返回并没有什么异常,只是.net内部就认定了 返回的不要是200 就是异常 那么我 ...

  5. 整理下webapi的一些琐碎事情

    在使用webapi的时候我们会遇到一些问题比如 1.POST怎么请求 2.怎么兼容JSONP请求 3.怎么给指定端提供跨域的请求 4.怎么显示单独的models层的注释 问题一二其他人都玩的比较成熟的 ...

  6. 使用Echarts的步骤

    Echarts官网地址:https://echarts.baidu.com/index.html 步骤如下: 1.获取Echarts (1)可以在Echarts官网去下载,选择需要的版本下载,根据开发 ...

  7. Json数据交换一Jackson

    依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>ja ...

  8. spss modeler出现使用错误提

    spss modeler出现使用错误提 1.对字段"compensation汇总导出"指定的类型不充分 问题: 为了分析需要,我加了一个"字段选项"--&quo ...

  9. day 56 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  10. Git 查看、删除、重命名远程分支

    原文地址:http://blog.csdn.net/sunnyyoona/article/details/52065544 1. 查看远程分支 分支加上-a参数可以查看远程分支,远程分支会用红色表示出 ...