【NOIP 费用流】JZOJ_3029 观光公交
题目
题目太长请自行阅读。
风景迷人的小城YYY市,拥有nnn个美丽的景点。由于慕名而来的游客越来越多,YYY市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第000分钟出现在111号景点,随后依次前往 2、3、4……n2、3、4……n2、3、4……n号景点。从第iii号景点开到第i+1i+1i+1号景点需要 DiD_iDi 分钟。任意时刻,公交车只能往前开,或在景点处等待。
设共有mmm个游客,每位游客需要乘车111次从一个景点到达另一个景点,第iii位游客在TiT_iTi 分钟来到景点AiA_iAi,希望乘车前往景点Bi(Ai<Bi)B_i(Ai<Bi)Bi(Ai<Bi)。为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。假设乘客上下车不需要时间。
一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司机 ZZZZZZ 给公交车安装了kkk个氮气加速器,每使用一个加速器,可以使其中一个DiD_iDi减111。对于同一个DiD_iDi可以重复使用加速器,但是必须保证使用后DiDiDi大于等于000。
那么ZZZZZZ该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?
思路
先求出不加速的答案,再用费用流求出加速可以减去的时间,最后就可以得出答案了。
首先我们要求出几个东西lastlastlast,downdowndown和getgetget。
其中lastilast_ilasti表示做第iii站最晚乘客的到达时间。
downidown_idowni表示第iii站下车乘客的数量。
getiget_igeti表示第iii站车到达的时间。
那么不加速的答案就为∑i=1mgetpi.b−pi.t\sum_{i=1}^{m}get_{p_i.b}-p_i.t∑i=1mgetpi.b−pi.t。
考虑费用流,我们这样构图:
s→s′s \rightarrow s's→s′,容量为kkk,费用为000,限制了加速器的个数。
对于每一个点,我们把它们拆成iii和i′i'i′。
s′→i′s' \rightarrow i's′→i′,容量为did_idi,费用为000,表示最多用did_idi个氮气。
i→i′i \rightarrow i'i→i′,容量为max(geti−lasti,0)max(get_i-last_i,0)max(geti−lasti,0),费用为000,代表这个站可以使用这么多个氮气加速使得后面能受到影响,因为过早地到达也要等待巴士到来。
i′→i+1i' \rightarrow i+1i′→i+1,容量为infinfinf,费用为downi+1down_{i+1}downi+1,表示接受氮气可以使经过这条路的人都减少111个时间。
i+1→ti+1\rightarrow ti+1→t,容量为infinfinf,费用为000,把流量流到汇点。
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>struct people{int t, a, b;
}p[100001];
struct node{int x, y, next, cost, flow;
}e[8001];
int n, m, k, ans, tot = 1;
int s, s1, t;
int d[1001], last[1001], get[1001], down[1001], head[2004], pre[2004], dis[2004], v[2004];const int inf = 2147483647;void add(int x, int y, int flow, int cost) {e[++tot].x = x;e[tot].y = y;e[tot].cost = cost;e[tot].flow = flow;e[tot].next = head[x];head[x] = tot;e[++tot].x = y;e[tot].y = x;e[tot].cost = -cost;e[tot].flow = 0;e[tot].next = head[y];head[y] = tot;
}int spfa() {std::queue<int> q;int x, y;memset(dis, 127 / 3, sizeof(dis));memset(v, 0, sizeof(v));q.push(s);dis[s] = 0;v[s] = 1;while (q.size()) {x = q.front();q.pop();v[x] = 0;for (int i = head[x]; i; i = e[i].next) {if (!e[i].flow) continue;y = e[i].y;if (dis[y] > dis[x] + e[i].cost) {dis[y] = dis[x] + e[i].cost;pre[y] = i;if (!v[y]) {v[y] = 1;q.push(y);}}}}return dis[t] < 707406378;
}void addflow() {int i = t, mn = 2147483647;while (pre[i]) {mn = std::min(mn, e[pre[i]].flow);i = e[pre[i]].x;}ans += dis[t] * mn;i = t;while (pre[i]) {e[pre[i]].flow -= mn;e[pre[i] ^ 1].flow += mn;i = e[pre[i]].x;}
}int main() {scanf("%d %d %d", &n, &m, &k);for (int i = 1; i < n; i++)scanf("%d", &d[i]);for (int i = 1; i <= m; i++) {scanf("%d %d %d", &p[i].t, &p[i].a, &p[i].b);last[p[i].a] = std::max(p[i].t, last[p[i].a]);down[p[i].b]++;}for (int i = 1; i < n; i++)get[i + 1] = std::max(last[i], get[i]) + d[i];for (int i = 1; i <= m; i++)ans += get[p[i].b] - p[i].t;s = n * 2 + 1;s1 = n * 2 + 2;t = n * 2 + 3;add(s, s1, k, 0);for (int i = 1; i < n; i++) {add(s1, i + n, d[i], 0);add(i + n, i + 1, inf, -down[i + 1]);//改成负的跑最小费用最大流add(i + 1, t, inf, 0);add(i, i + n, std::max(get[i] - last[i], 0), 0);}while (spfa())addflow();printf("%d", ans);
}
【NOIP 费用流】JZOJ_3029 观光公交相关推荐
- NOIP 模拟 box - 费用流 / 匈牙利
题目大意: 给出n(\(\le 200\))个盒子,第i个盒子长\(x_i\),宽\(y_i\),一个盒子可以放入长宽都大于等于它的盒子里,并且每个盒子里只能放入一个盒子(可以嵌套),嵌套的盒子的占地 ...
- P1315,jzoj3029-观光公交【费用流】
前言 你绝对想不到,我用费用流神仙构图做了一道 的题 正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1315 题目大 ...
- [BZOJ 1221][HNOI2001]软件开发(费用流)
Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...
- 费用流 -- 四川省赛F-Direction Setting [拆边成点+费用流]
题目链接 题目大意: 就是给你一个nnn个点mmm条边的无向图,每个点有个值是aia_iai现在你把每条边都赋予一个方向之后这个图就是有向图了,那么设第iii个点的入度是did_idi,现在设 D ...
- UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)
题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...
- 餐巾计划问题 线性规划与网络流24题之10 费用流
相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
- bzoj3171: [Tjoi2013]循环格(费用流)
传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...
最新文章
- 32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?
- 简书的css排版,css格式化排版
- 数据包接收系列 — IP协议处理流程(一)
- datagridview滚动条自动滚动_微软新贡献:进一步优化Chromium的滚动特性
- 从0到1:Python爬虫知识点梳理
- excel小写转大写公式_喂!这边居然有演示的Excel快捷键!
- 不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App
- 以为GAN只能“炮制假图”?它还有这7种另类用途
- Selenium之Chrome浏览器的启动问题及解决
- FastDFS入门一篇就够
- java即时聊天系统_基于Java技术的即时聊天系统实现(含源文件).doc
- Android基于百度OCR识别图片中的文字
- 搭建本地服务器中遇到无法启动FTP站点问题
- WTL 自绘控件库 (CQsAnimaStatic)
- Elastic:data_hot,data_warm,data_cold角色有什么用
- 最新公路测量计算机,公路施工测量坐标计算系统
- 最近穷疯了只好吃馒头
- 电子邮箱的工作原理以及SMTP、POP3、IMAP之间的联系和区别
- 海上风电场对雷达性能的影响——雷达回波
- Springboot一:多环境配置、热部署、单元测试 MockMvc
热门文章
- ios 图表_在ios应用中实现蜘蛛网图表
- 关于将数据写入文件的两个函数fwrite()与fprintf()的大不同 —————— 开开开山怪
- SQL Transformation
- 从安防监控走进手机VR 红外线LED翻身
- QStyle之PenStyle的CustomDashLine使用
- 防火墙的访问控制策略
- Java为PDF文档加密
- 盘点:上海十处最具情调的小资地!(组图)
- ​在线问题反馈模块实战(十二)​:实现图片删除功能
- html作业介绍家乡,dreamweaver网页大作业 我的家乡