最小割的建图模式一般是,先算出总收益,然后再通过网络模型进行割边减去部分权值。

然后我们需要思考什么才能带来收益,什么才能有权值冲突。

s连向选的点,t连向不选的点,那么收益的减少量应该就是将s集和t集分开的割边集。

下面说这道题的建图:

点:

  每个人一个点,额外设源汇点。

边:

  源向人连这个人能造成的全部收益(当作雇佣所有人,然后此人造成的收益)

  人与人之间连两人熟悉度*2,呃,题意问题。

  人向汇连雇佣需要花的钱。

  1. # include <cstdio>
  2. # include <cstring>
  3. # include <cstdlib>
  4. # include <iostream>
  5. # include <vector>
  6. # include <queue>
  7. # include <stack>
  8. # include <map>
  9. # include <bitset>
  10. # include <set>
  11. # include <cmath>
  12. # include <algorithm>
  13. using namespace std;
  14. # define lowbit(x) ((x)&(-x))
  15. # define pi acos(-1.0)
  16. # define eps 1e-
  17. # define MOD
  18. # define INF (LL)<<
  19. # define mem(a,b) memset(a,b,sizeof(a))
  20. # define FOR(i,a,n) for(int i=a; i<=n; ++i)
  21. # define FO(i,a,n) for(int i=a; i<n; ++i)
  22. # define bug puts("H");
  23. # define lch p<<,l,mid
  24. # define rch p<<|,mid+,r
  25. # define mp make_pair
  26. # define pb push_back
  27. typedef pair<int,int> PII;
  28. typedef vector<int> VI;
  29. # pragma comment(linker, "/STACK:1024000000,1024000000")
  30. typedef long long LL;
  31. int Scan() {
  32. int x=,f=;char ch=getchar();
  33. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  34. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  35. return x*f;
  36. }
  37. const int N=;
  38. //Code begin...
  39.  
  40. struct Edge{int p, next; LL w;}edge[N*N*];
  41. int head[N], cnt=, s, t, vis[N];
  42. queue<int>Q;
  43. LL ss[N];
  44.  
  45. void add_edge(int u, int v, LL w){
  46. edge[cnt].p=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++;
  47. edge[cnt].p=u; edge[cnt].w=; edge[cnt].next=head[v]; head[v]=cnt++;
  48. }
  49. int bfs(){
  50. int i, v;
  51. mem(vis,-); vis[s]=; Q.push(s);
  52. while (!Q.empty()) {
  53. v=Q.front(); Q.pop();
  54. for (int i=head[v]; i; i=edge[i].next) {
  55. if (edge[i].w>&&vis[edge[i].p]==-) vis[edge[i].p]=vis[v]+, Q.push(edge[i].p);
  56. }
  57. }
  58. return vis[t]!=-;
  59. }
  60. LL dfs(int x, LL low){
  61. int i;
  62. LL a, temp=low;
  63. if (x==t) return low;
  64. for (int i=head[x]; i; i=edge[i].next) {
  65. if (edge[i].w>&&vis[edge[i].p]==vis[x]+) {
  66. a=dfs(edge[i].p,min(edge[i].w,temp));
  67. temp-=a; edge[i].w-=a; edge[i^].w+=a;
  68. if (temp==) break;
  69. }
  70. }
  71. if (temp==low) vis[x]=-;
  72. return low-temp;
  73. }
  74. LL dinic(){
  75. LL sum=;
  76. while (bfs()) sum+=dfs(s,INF);
  77. return sum;
  78. }
  79. int main ()
  80. {
  81. int n;
  82. LL ans=, x;
  83. scanf("%d",&n); s=; t=n+;
  84. FOR(i,,n) scanf("%lld",&x), add_edge(i,t,x);
  85. FOR(i,,n) FOR(j,,n) {
  86. scanf("%lld",&x); ss[i]+=x;
  87. if (i==j||!x) continue;
  88. add_edge(i,j,x*);
  89. }
  90. FOR(i,,n) add_edge(s,i,ss[i]), ans+=ss[i];
  91. LL res=dinic();
  92. printf("%lld\n",ans-res);
  93. return ;
  94. }

BZOJ 2039 人员雇佣(最小割)的更多相关文章

  1. BZOJ 2039 人员雇佣 二元关系 最小割

    题面太长了,请各位自行品尝—>人员雇佣 分析: 借用题解的描述: a.选择每个人有一个代价Ai b.如果有两个人同时选择就可以获得收益Ei,j c.如果一个人选择另一个不选会产生代价Ei,j 这 ...

  2. BZOJ 2039 / Luogu P1791 [2009国家集训队]employ人员雇佣 (最小割)

    题面 BZOJ传送门 Luogu传送门 分析 考虑如何最小割建图,因为这仍然是二元关系,我们可以通过解方程来确定怎么建图,具体参考论文 <<浅析一类最小割问题 湖南师大附中 彭天翼> ...

  3. 【BZOJ2039】【2009国家集训队】人员雇佣 [最小割]

    人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 作为一个富有经营头脑的富翁,小L决 ...

  4. BZOJ 2039人员雇佣

    这道题教会我们一个道理靠谁也不如靠自己. 当时学长已经讲了,然而一脸懵逼,好吧,上网搜题解,二脸懵逼,于是自己动手,丰衣足食.自己推! 首先就是建模了,这道题谁与谁之间建模已经十分明了,超级源点,超级 ...

  5. 【BZOJ2039】[2009国家集训队]employ人员雇佣 最小割

    [BZOJ2039][2009国家集训队]employ人员雇佣 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献 ...

  6. [BZOJ 2127] happiness 【最小割】

    题目链接:BZOJ - 2127 题目分析 首先,每个人要么学文科,要么学理科,所以可以想到是一个最小割模型. 我们就确定一个人如果和 S 相连就是学文,如果和 T 相连就是学理. 那么我们再来确定建 ...

  7. BZOJ.3532.[SDOI2014]LIS(最小割ISAP 退流)

    BZOJ 洛谷 \(LIS\)..经典模型? 令\(f_i\)表示以\(i\)结尾的\(LIS\)长度. 如果\(f_i=1\),连边\((S,i,INF)\):如果\(f_i=\max\limits ...

  8. BZOJ 2561 最小生成树 | 网络流 最小割

    链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容 ...

  9. bzoj 1497 最大获利 - 最小割

    新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成前期市场研 ...

随机推荐

  1. python append extend区别

    1. 列表可包含任何数据类型的元素,单个列表中的元素无须全为同一类型. 2. append() 方法向列表的尾部添加一个新的元素. 3. 列表是以类的形式实现的.“创建”列表实际上是将一个类实例化.因 ...

  2. OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解

    原文:OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 Title : cv::Mat depth/dims/channels ...

  3. day4 CSS属性操作

    1.CSS属性 基本属性 height, 高度 百分比 width, 宽度 像素,百分比 text-align:ceter, 水平方向居中 line-height, 垂直方向根据标签高度 color. ...

  4. Yii2.0 高级模版编写使用自定义组件(component)

    翻译自:http://www.yiiframework.com/wiki/760/yii-2-0-write-use-a-custom-component-in-yii2-0-advanced-tem ...

  5. 微软office web apps 服务器搭建之在线文档预览(二)

    上一篇文章已经介绍了整个安装过程了.只要在浏览器中输入文档转换server的ip,会自动跳转,出现如下页面. 那么就可以实现本地文档预览了,你可以试试.(注意:是本地哦,路径不要写错,类似“\\fil ...

  6. nginx基础配置加基础实战演示

    目录 基本配置 设置用户 工作衍生进程数 错误日志存放路径 pid文件存放路径 设置最大连接数 http->server gzip 字符编码 nginx的基本格式 实战配置 虚拟主机配置 开始配 ...

  7. 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型

    人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...

  8. Java解惑之TreeSet是如何去重的

    引言: 最近在处理一个问题,大致是这个样子,从数据库里面取出一个集合,取出来的数据放到一个JavaBean里面.结果得到的集合长度为1. TreeSetSet的一个实现,默认实现排序:故TreeSet ...

  9. python常用快捷键

    最重要的快捷键1. ctrl+shift+A:万能命令行2. shift两次:查看资源文件 新建工程第一步操作1. module设置把空包分层去掉,compact empty middle packa ...

  10. 如何让QT程序以管理员权限运行(UAC)

    方案一:(仅适用于使用msvc编译器) 在PRO文件中添加一行指令即可, QMAKE_LFLAGS += /MANIFESTUAC:"level='requireAdministrator' ...