思路

巧妙的建图

因为每个志愿者有工作的时段,所以考虑让一个志愿者的流量能够从S流到T产生贡献

所以每个i向i+1连INF-a[x]的边(类似于k可重区间集),每个si向ti连边cap=INF,cost=ci的边

相当于就是最大流要补全到INF,然后这个边的边权少了a[x],然后为了补全到INF,并且前面还有一个能从s向t能走的边可以通过流量(相当于加一个人),然后最大流就会补上这部分流量

然后MCMF就好了

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <queue>
  5. #include <vector>
  6. using namespace std;
  7. struct Edge{
  8. int u,v,cap,cost,flow;
  9. };
  10. const int MAXN = 50000;
  11. const int INF = 0x3f3f3f3f;
  12. vector<Edge> edges;
  13. vector<int> G[MAXN];
  14. void addedge(int u,int v,int cap,int cost){
  15. edges.push_back((Edge){u,v,cap,cost,0});
  16. edges.push_back((Edge){v,u,0,-cost,0});
  17. int cnt=edges.size();
  18. G[u].push_back(cnt-2);
  19. G[v].push_back(cnt-1);
  20. }
  21. int d[MAXN],a[MAXN],p[MAXN],s,t,vis[MAXN],n,m;
  22. queue<int> q;
  23. bool spfa(int &flow,int &cost){
  24. memset(d,0x3f,sizeof(d));
  25. memset(p,0,sizeof(p));
  26. q.push(s);
  27. a[s]=INF;
  28. d[s]=0;
  29. vis[s]=true;
  30. while(!q.empty()){
  31. int x=q.front();
  32. q.pop();
  33. vis[x]=false;
  34. for(int i=0;i<G[x].size();i++){
  35. Edge &e = edges[G[x][i]];
  36. if(e.cap>e.flow&&d[x]+e.cost<d[e.v]){
  37. d[e.v]=d[x]+e.cost;
  38. a[e.v]=min(a[x],e.cap-e.flow);
  39. p[e.v]=G[x][i];
  40. if(!vis[e.v]){
  41. vis[e.v]=true;
  42. q.push(e.v);
  43. }
  44. }
  45. }
  46. }
  47. if(d[t]==INF)
  48. return false;
  49. flow+=a[t];
  50. cost+=a[t]*d[t];
  51. for(int i=t;i!=s;i=edges[p[i]].u){
  52. edges[p[i]].flow+=a[t];
  53. edges[p[i]^1].flow-=a[t];
  54. }
  55. return true;
  56. }
  57. void mcmf(int &flow,int &cost){
  58. flow=0,cost=0;
  59. while(spfa(flow,cost));
  60. }
  61. int main(){
  62. scanf("%d %d",&n,&m);
  63. s=MAXN-2;
  64. t=MAXN-3;
  65. for(int i=1;i<=n;i++){
  66. int x;
  67. scanf("%d",&x);
  68. addedge(i,i+1,INF-x,0);
  69. }
  70. for(int i=1;i<=m;i++){
  71. int sx,tx,cx;
  72. scanf("%d %d %d",&sx,&tx,&cx);
  73. addedge(sx,tx+1,INF,cx);
  74. }
  75. addedge(s,1,INF,0);
  76. addedge(n+1,t,INF,0);
  77. int cost,flow;
  78. mcmf(flow,cost);
  79. printf("%d\n",cost);
  80. return 0;
  81. }

P3980 [NOI2008]志愿者招募的更多相关文章

  1. 【洛谷】P3980 [NOI2008]志愿者招募

    [洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...

  2. P3980 [NOI2008]志愿者招募 费用流 (人有多大胆地有多大产

    https://www.luogu.org/problemnew/show/P3980 感觉费用流比网络流的图更难想到,要更大胆.首先由于日期是连续的,所以图中的点是横向排列的. 这道题有点绕道走的意 ...

  3. 洛谷P3980 [NOI2008]志愿者招募

    题解 最小费用最大流 每一天是一条边\((inf-a[i], 0)\) 然后对于一类志愿者, 区间两端连一条\((inf, c[i])\) \(S\)向第一个点连\((inf, 0)\) 最后一个点向 ...

  4. luogu P3980 [NOI2008]志愿者招募

    传送门 网络流又一神仙套路应用 首先考虑列不等式,设\(x_i\)为第i种人的个数,记\(b_{i,j}\)为第i种人第j天是否能工作,那么可以列出n个不等式,第j个为\(\sum_{i=1}^{m} ...

  5. P3980 [NOI2008]志愿者招募 (费用流)

    题意:最多1000天 每天需要至少ai个工人施工 有10000种工人可以雇佣 每种工人可以工作si到ti天 雇佣一个的花费是ci 问怎样安排使得施工花费最少 思考:最直白的建模方式 就是每种工人可以和 ...

  6. BZOJ 1061: [Noi2008]志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4064  Solved: 2476[Submit][Stat ...

  7. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  8. [BZOJ1061][Noi2008]志愿者招募

    [BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...

  9. BZOJ 1061: [Noi2008]志愿者招募 费用流

    1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...

随机推荐

  1. sitecore系列教程之营销人员和技术人员如何策划与消费者的对话以提升体验?

    “每次良好的交谈都要从良好的倾听开始.” - 未知 你是如何听取网站访问者的?你是在倾听还是只是回复? 拥有内容管理系统只是良好网站战略的一个要素.毕竟,内容必须是动态的,及时的和相关的. 当网站访问 ...

  2. Sql日期时间格式转换[zhuan]

    sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, 20) 结果:2007-0 ...

  3. pcb走线注意事项笔记

    一.高压隔离. PCB的安全距离: 1.电气间隙或者叫做控件距离. (两相邻的后者一个到相邻电机壳表面的沿空气测量的最短距离,电气间隙的决定,根据测量的工作电压以及绝缘等级就可以决定距离.) a.一次 ...

  4. selenium-java web自动化测试工具抓取百度搜索结果实例

    selenium-java web自动化测试工具抓取百度搜索结果实例 这种方式抓百度的搜索关键字结果非常容易抓长尾关键词,根据热门关键词去抓更多内容可以用抓google,百度的这种内容容易给屏蔽,用这 ...

  5. Qt介绍1---QPA(Qt Platform Abstraction)

    Qt是一个夸平台的库(一直宣称“Qt everywhere”),但是Qt底层不是夸平台的.比如:Qt中Gui部件的核心类QWidget,该类除了qwidget.h 和 qwidget.cpp两个原文件 ...

  6. jQuery实现无刷新切换主题皮肤功能

    主题皮肤切换功能在很多网站和系统中应用,用户可以根据此功能设置自己喜欢的主题颜色风格,增强了用户体验.本文将围绕如何使用jQuery实现点击无刷新切换主题皮肤功能. 查看演示DEMO:https:// ...

  7. ajax实现图片上传

    1.创建formData表单,模拟表单传递数据(formData有兼容性问题) var formData = new FormData();2.获取到相应的元素 var jobName = $(&qu ...

  8. 通过 Java 线程堆栈进行性能瓶颈分析

    改善性能意味着用更少的资源做更多的事情.为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使 CPU 尽可能出于忙碌状态(当然,并不是让 CPU 周期出于应付无用计算, ...

  9. puts函数

    1.puts函数是gets函数的输出版本,它把指定的字符串写到标准输出并在末尾添加一个换行符 #include <stdio.h> #include <stdlib.h> in ...

  10. EDK II之USB设备驱动程序的加载与运行

    本文简单介绍一下USB设备的驱动程序是如何匹配设备以及被加载的: 上文(UDK中USB总线驱动的实现框架)提到USB总线枚举设备的最后一步是调用gBS->ConnectController()去 ...