[JSOI2008]Blue Mary的旅行

[**[JSOI2008]Blue Mary的旅行**](https://www.luogu.org/problem/P4400)

#### 题解:

看见这些人流动的过程,我们很容易想到网络流,看见最早到达时间,~~我们很容易想到费用流~~。

我们可以看出题目中所说的z对应着网络流中的容量,但是一天过后又重新可以使用这一条边,我们显然不能直接跑网络流,对于一个人,它的贡献为$1$,所以这道题可以转化为一个最大流的模型.

考虑整个问题,朝贪心的方面去想,要尽量的选择一条$s$到$t$的最短路径,选择s到t的最短路径,不会使答案更差,但是选完这一条路后,仍然可以选这一条路,此时被选过的最短路径可能会劣于$s$到$t$的另一条路径,因为花费了$1$单位的时间,考虑去掉时间的限制,我们可以二分答案.

对于二分的$mid$,可以将最短路径在$mid$时间里的所有贡献累加到答案里,现在要考虑如何找到这么一条最短路径。考虑$dinic$的过程,每一次找到一个分层图,分层图的性质可以$s$到$t$的任意一条路径都相同且在原图中最短,每一次求出的最大流就是一次所能达到$t$的最大人数。由于在分层图中都是最短路,则选择都可以是答案不会更差,将这一些人在$mid$时间内的贡献累加值答案。

原文地址:https://www.cnblogs.com/zhouhuanyi/p/12233046.html

时间: 2024-08-01 06:02:04

[JSOI2008]Blue Mary的旅行的相关文章

【bzoj1570】[JSOI2008]Blue Mary的旅行 动态加边网络流

题目描述 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决定亲自去签下这份订单.为了节省旅行经费,他的某个金融顾问建议只购买U航空公司的机票.U航空公司的所有航班每天都只有一班,并且都是上午出发当天下午到达的,所以他们每人每天只能坐一班飞机.经过调查,他们得到了U航空公司经营的所有航班的详细信息,这包括每一航班的出发地,目的地以及最多能买到的某一天出发的票数.(注意: 对于一个确定的航班,无论是哪一天,他们最多能买到的那一天出发的票数

【bzoj1507】 JSOI2008—Blue Mary的旅行

http://www.lydsy.com/JudgeOnline/problem.php?id=1570 (题目链接) 题意 给出$m$个航班,每天只能做一次飞机,有$T$人从起点到终点,问最晚到达的人最早什么时候到. Solution 枚举答案分层建图最大流判断即可.之前的流量不要清空. 细节 ? 代码 // bzoj1570 #include<algorithm> #include<iostream> #include<cstdlib> #include<cs

BZOJ1570 [JSOI2008]Blue Mary的旅行

建分层图,每一层表示一天的情况 从S向第0层的1号点连边,每层的n向T连INF的边 枚举天数,每多一天就多建一层然后跑最大流,如果当前流量大于人数则输出答案 由于路径长度不会超过n,因此tot个人走这条路径总天数不会超过tot + n,故只需要建tot + n层即可 1 /************************************************************** 2 Problem: 1570 3 User: rausen 4 Language: C++ 5 R

BZOJ 1570 JSOI2008 Blue Mary的旅行 网络流

题目大意:给定一张有向图,每条边每天最多经过有限次,一个人每天只能经过一条边,T个人从1号点出发,问多少天之后能到达n点 将图分层,每一天分作一层,每一层的点向下一层连边 从源点向第0层的1号点连边 每层的n向T连INF的边 从1开始枚举天数,每多一天就多建一层然后跑最大流,如果当前T个人已经能到达点n则输出答案 由于1~n的路径长度不会超过n,因此T个人排队走这条路径总天数不会超过T+n 故只需要建n+T层即可出解 点数O(n^2+nT) 边数O(mn+mT) 都不是很大 可以跑出来 #inc

BZOJ 1567: [JSOI2008]Blue Mary的战役地图

二次联通门 : BZOJ 1567: [JSOI2008]Blue Mary的战役地图 /* BZOJ 1567: [JSOI2008]Blue Mary的战役地图 社会我栋哥 人怂P话多 暴力能A题 正解能WA0 */ #include <cstdio> #include <iostream> #define rg register inline void read (int &n) { rg char c = getchar (); for (n = 0; !isdig

BZOJ 1568: [JSOI2008]Blue Mary开公司(超哥线段树)

1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1080  Solved: 379[Submit][Status][Discuss] Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Blue Mary询问第T天的最大收益. 若单词为Project,则

数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司

1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit][Status][Discuss] Description Input 第 一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Blue Mary询问第T天的最大收益. 若单词为Project,则

bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司

http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 100001 double a[N<<2],b[N<<2]; bool have[N<<2]; long long ans; void

1568: [JSOI2008]Blue Mary开公司

1568: [JSOI2008]Blue Mary开公司 题目描述 传送门 题目分析 简单分析可以发现就是不停给出了\(n\)条直线,要求每次给出一条直线后求出所有直线在横坐标为\(x\)时\(y\)的最大值. 李超树裸题. 不知道李超树的可以移步百度. 是代码呢 #include <bits/stdc++.h> using namespace std; #define ls rt<<1 #define rs rt<<1|1 #define mid ((l+r)/2)