题目传送门

网络流,求最小割。

设tot为所有盈利的和,即所有人(不花钱)雇佣。

对于S->i建一条容量为c[i]的边,i->j建一条S[i][j]*2的边,之所以这样建是因为如果不选这个人还会亏S[i][j]。

对于i->T建一条容量为∑S[i][j]的边。

最小割=最大流,跑Dinic

code:

  1. /**************************************************************
  2. Problem: 2039
  3. User: yekehe
  4. Language: C++
  5. Result: Accepted
  6. Time:4428 ms
  7. Memory:52316 kb
  8. ****************************************************************/
  9.  
  10. #include <cstdio>
  11. #include <cstring>
  12. #include <iostream>
  13. #include <algorithm>
  14. using namespace std;
  15.  
  16. int read()
  17. {
  18. char c;while(c=getchar(),c<''||c>'');
  19. int x=c-'';while(c=getchar(),c>=''&&c<='')x=x*+c-'';
  20. return x;
  21. }
  22.  
  23. int N,a[],MP[][];
  24. int head[],nxt[],To[],W[],cnt;
  25.  
  26. void add(int x,int y,int c)
  27. {
  28. To[cnt]=y,W[cnt]=c;
  29. nxt[cnt]=head[x];
  30. head[x]=cnt;
  31. cnt++;
  32. }
  33.  
  34. int dist[],l[],h,t;
  35. int BFS()
  36. {
  37. h=t=;
  38. memset(dist,0xfff,sizeof dist);
  39. l[++t]=,dist[]=;
  40. while(h<t){
  41. int front=l[++h];
  42. for(int i=head[front];i!=-;i=nxt[i]){
  43. if(dist[To[i]]==- && W[i]){
  44. dist[To[i]]=dist[front]+;
  45. l[++t]=To[i];
  46. }
  47. }
  48. }
  49. return dist[N+]!=-;
  50. }
  51.  
  52. int DFS(int x,int w)
  53. {
  54. if(x==N+ || !w)return w;
  55. int res=;
  56. for(int i=head[x];i!=-&&w;i=nxt[i]){
  57. if(dist[x]+==dist[To[i]] && W[i]){
  58. int DK=DFS(To[i],min(w,W[i]));
  59. res+=DK;w-=DK;
  60. W[i]-=DK,W[i^]+=DK;
  61. }
  62. }
  63. if(!res)dist[x]=-;
  64. return res;
  65. }
  66.  
  67. int tot=;
  68. void Dinic()
  69. {
  70. int ans=;
  71. while(BFS())
  72. ans+=DFS(,2e9);
  73. printf("%d",tot-ans);
  74. return ;
  75. }
  76.  
  77. int main()
  78. {
  79. memset(head,-,sizeof head);
  80. memset(nxt,-,sizeof nxt);
  81. N=read();
  82. register int i,j;
  83. for(i=;i<=N;i++)
  84. a[i]=read(),add(,i,a[i]),add(i,,);
  85. for(i=;i<=N;i++)
  86. for(j=;j<=N;j++)
  87. MP[i][j]=read(),tot+=MP[i][j];
  88. for(i=;i<=N;i++)
  89. for(j=i+;j<=N;j++)
  90. add(i,j,MP[i][j]<<),add(j,i,MP[i][j]<<);
  91. for(i=;i<=N;i++){
  92. int res=;for(j=;j<=N;j++)res+=MP[i][j];
  93. add(i,N+,res),add(N+,i,);
  94. }
  95. Dinic();
  96. return ;
  97. }

BZOJ2039_employ人员雇佣_KEY的更多相关文章

  1. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  2. BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割

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

  3. 【BZOJ 2039】 2039: [2009国家集训队]employ人员雇佣 (最小割)

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1511  Solved: 728 Descri ...

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

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

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

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

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

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

  7. BZOJ2039 [2009国家集训队]employ人员雇佣

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2039 鉴于一开始看题如果不仔细是看不懂题目的,还是说一下题目大意 [题目大意]:给定n个人 ...

  8. 2039: [2009国家集训队]employ人员雇佣

    任意门 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即 ...

  9. BZOJ 2039 人员雇佣(最小割)

    最小割的建图模式一般是,先算出总收益,然后再通过网络模型进行割边减去部分权值. 然后我们需要思考什么才能带来收益,什么才能有权值冲突. s连向选的点,t连向不选的点,那么收益的减少量应该就是将s集和t ...

随机推荐

  1. 左右值无限级分类 MVC + EntityFramework 的简单实现

    在度娘上查了大半个月的资料,最后发现每个网友分享的文章都有一定的错误(PS:大家是故意的么?).最后是在看了一个ASP版本后知道了大概流程:看了一个存储过程实现的文章后知道了大概需要的功能:看了一个S ...

  2. CSS 预处理器

    在程序员眼里,css不像其他程序语言(例如PHP, Javascript等等),有自己的变量.常量.条件语句以及一些编程语法,它只是一行行单纯的属性描述,写起来相当费事,而且代码难以组织和维护.自然的 ...

  3. css3动画相关笔记

    1.$(".aa").delay(2500).animate({width:0}); // 延迟 2.setTimeout(function(){ --> css3 anim ...

  4. python之九九乘法表

    for i in range(1,10): print( ) for j in range(1,i+1): print('%d*%d=%d '%(i,j,i*j),end="") ...

  5. momenta

    编程:1.dp的题 2.白纸写代码,给一串数和一个目标值,使用四则运算和括号使得这串数最后计算结果为目标值,打印出所有的方案,要求是这些数每个最多被使用一次,可以不被用到. 3.考了一个查找数组里,未 ...

  6. MAC 下 安装redis 并配置 php redis 扩展

    下载 redis redis-3.1.2.tgz sudo tar -xzf redis-3.1.2.tgz cd redis-3.1.2 sudo phpize grep: /usr/include ...

  7. 解决Bug步骤

    1.看报错.将bug定位到文件.类.方法. 2.打断点.将bug定位到具体代码行号. 3.分析断点输出结果. 4.结合报错和断点结果,修改代码. 总之:拆解问题.定位问题.分析问题.解决问题.

  8. HDU 1599 find the mincost route(floyd求最小环 无向图)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1599 find the mincost route Time Limit: 1000/2000 MS ...

  9. f-stack中nginx配置后make出现error: ignoring return value of ‘ftruncate’

    问题 Nginx 配置后 make 出现error: src/os/unix/ngx_process_cycle.c: In function 'ngx_start_worker_processes' ...

  10. 不会发布npm包?进来看看?

    前言 npm(Node Package Manager),一个Node的包管理器,平时我们常用的公共模块(插件)或者叫做包大多都放在上面,所以接下来要封装的插件,我们就简单称它为npm包,本文从就从这 ...