正题

题目链接:https://www.luogu.com.cn/problem/P3980


题目大意

\(n\)天,第\(i\)天需要\(A_i\)个志愿者。有\(m\)种志愿者,第\(i\)种从\(s_i\)天服务到\(t_i\)天,需要\(c_i\)元的费用。

求满足条件的最小费用

\(1\leq n\leq 1000,1\leq m\leq 10000\)


解题思路

考虑费用流

如果雇佣了\(s_i\)天到\(t_i\)天的话那么就相当于将这段范围\(A_i\)的值减一,注意到是区间的\(1\)需要\(c_i\)的费用,那么肯定这个条件是压缩成一条边的,也就是\(s_i\)向\(t_i+1\)连接费用为\(1\)的边。

这样的话考虑如何满足条件,注意到是减一也就是抽走一条经过\(s_i\)到\(t_i\)的流量,也就是对于这些流量的限制。

建立\(n\)个点,\(i\)向\(i+1\)连接流量为\(T-A_i\)(\(T\)是一个很大的数就可以了)表示至少需要抽走\(A_i\)的流量就好了。

然后跑费用流


code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #define ll long long
  6. using namespace std;
  7. const ll N=1100,T=(1ll<<31),inf=1e18;
  8. struct node{
  9. ll to,next,w,c;
  10. }a[N*22];
  11. ll n,m,s,t,tot=1,ans,ls[N],f[N],mf[N],pre[N];
  12. bool v[N];queue<int> q;
  13. void addl(ll x,ll y,ll w,ll c){
  14. a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[tot].c=c;
  15. a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;a[tot].c=-c;
  16. return;
  17. }
  18. bool SPFA(){
  19. memset(f,0x3f,sizeof(f));
  20. q.push(s);f[s]=0;v[s]=1;mf[s]=T;
  21. while(!q.empty()){
  22. ll x=q.front();q.pop();v[x]=0;
  23. for(ll i=ls[x];i;i=a[i].next){
  24. ll y=a[i].to;
  25. if(a[i].w&&f[x]+a[i].c<f[y]){
  26. f[y]=f[x]+a[i].c;pre[y]=i;
  27. mf[y]=min(mf[x],a[i].w);
  28. if(!v[y])v[y]=1,q.push(y);
  29. }
  30. }
  31. }
  32. return (f[t]<inf);
  33. }
  34. void Updata(){
  35. ll x=t;ans+=mf[t]*f[t];
  36. while(x!=s){
  37. a[pre[x]].w-=mf[t];
  38. a[pre[x]^1].w+=mf[t];
  39. x=a[pre[x]^1].to;
  40. }
  41. return;
  42. }
  43. signed main()
  44. {
  45. scanf("%lld%lld",&n,&m);
  46. s=n+2;t=s+1;
  47. addl(s,1,T,0);
  48. for(ll i=1;i<=n;i++){
  49. ll x;
  50. scanf("%lld",&x);
  51. addl(i,i+1,T-x,0);
  52. }
  53. for(ll i=1;i<=m;i++){
  54. ll s,t,c;
  55. scanf("%lld%lld%lld",&s,&t,&c);
  56. addl(s,t+1,T,c);
  57. }
  58. addl(n+1,t,T,0);
  59. while(SPFA())
  60. Updata();
  61. printf("%lld\n",ans);
  62. return 0;
  63. }

P3980-[NOI2008]志愿者招募【费用流】的更多相关文章

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

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

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

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

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

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

  4. [BZOJ1061] [Noi2008] 志愿者招募 (费用流)

    Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能 ...

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

    大意: $n$天, 第$i$天要$a_i$个志愿者. $m$种志愿者, 每种无限多, 第$i$种工作时间$[s_i,t_i]$花费$c_i$, 求最少花费. 源点$S$连第一天, 容量$INF$ 第$ ...

  6. Vijos1825 NOI2008 志愿者招募 费用流

    Orz ByVoid大神的题解:https://www.byvoid.com/blog/noi-2008-employee/ 学习网络流建图的好题,不难想到线性规划的模型,不过利用模型的特殊性,结合网 ...

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

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

  8. 从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流)

    从多种角度看[BZOJ 1061] [NOI 2008]志愿者招募(费用流) 题面 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运 ...

  9. [NOI2008][bzoj1061] 志愿者招募 [费用流+巧妙的建图]

    题面 传送门 思路 引入:网络流? 看到这道题,第一想法是用一个dp来完成决策 但是,显然这道题的数据并不允许我们进行dp,尤其是有10000种志愿者的情况下 那么我们就要想别的办法来解决: 贪心?这 ...

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

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

随机推荐

  1. @ImportResource-SpringBoot使用xml配置Bean

    前言 SpringBoot推荐使用注解的方式去声明bean,但还是提供了xml的方式去加载bean 一.创建要声明为bean的实体类 WzqEntity.java package com; /** * ...

  2. LeetCoded第25题题解--K个一组翻转链表--java--链表

    链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素的引用字段链接在一起. 双链表:与单链表不同的是,双链表的每个节点都含有两个引用字段. 链表优点 灵活分配内存空间 能在O ...

  3. Javascript - Vue - webpack + vue-cil

    cnpm(node package manager)和webpack模块 npm是运行在node.js环境下的包管理工具(先安装node.js,再通过命令 npm install npm -g 安装n ...

  4. JDBC中级篇——批处理和PreparedStatement对有sql缓冲区的数据库的友好,测试

    注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package a_batch; import util.JdbcUtil; import java.sql.Connection; ...

  5. JavaWeb之分页查询

    时间:2016-12-11 01:41 1.分页的优点:    只查询一页,不需要查询所有数据,能够提高效率.2.分页数据    页面的数据都是由Servlet传递的    *   当前页:pageC ...

  6. 微信小程序学习笔记一 小程序介绍 & 前置知识

    微信小程序学习笔记一 1. 什么是小程序? 2017年度百度百科十大热词之一 微信小程序, 简称小程序, 英文名 Mini Program, 是一种不需要下载安装即可使用的应用 ( 张小龙对其的定义是 ...

  7. linux系统下深度学习环境搭建和使用

    作为一个AI工程师,对Linux的一些技能的掌握也能从一定层面反应工程师的资深水平. 要求1:基于SSH的远程访问(本篇文章) 能用一台笔记本电脑,远程登陆一台linux服务器 能随时使用笔记本电脑启 ...

  8. CSS 是啥?前端小白入门级理解

    What is CSS? CSS stands for Cascading Style Sheets CSS describes how HTML elements are to be display ...

  9. 解决win10 cmd运行python弹出windows应用商店下python应用程序

    方法一: 1.我一开始下载完python后,忘记下载到哪个位置,在win10底下输入框搜索python,点击打开文件所在位置,所在位置是python快捷键的位置,直接复制进行环境配置 配置完环境变量后 ...

  10. uboot命令简介

    uboot下的命令行 1.典型嵌入式linux系统启动过程: 嵌入式系统上电后先执行uboot.然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS( ...