传送门

Luogu

解题思路

分层图加网络流,有点像这题

可以证明最多不超过100天,所以才可以分层,不然图的规模会很大。

首先连源点汇点: \((s,1,INF), (n, t, INF)\)

以时间分层,每次把原图中的边 \((u, v, w)\) 改为一条 \((u_{day1}, v_{day2}, w)\) 的弧。

对于 \(u < n\),连一条弧 \((u_{day1}, u_{day2}, INF)\),以及一条 \((n_{day2}, n_{day1}, INF)\)。

然后每次在残量网络上加边增广直至最大流大于等于 \(T\)。

细节注意事项

  • 每次增广时都要把流量累加

参考代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <ctime>
  9. #include <queue>
  10. #define rg register
  11. using namespace std;
  12. template < typename T > inline void read(T& s) {
  13. s = 0; int f = 0; char c = getchar();
  14. while (!isdigit(c)) f |= (c == '-'), c = getchar();
  15. while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
  16. s = f ? -s : s;
  17. }
  18. const int _ = 5010;
  19. const int __ = 250010;
  20. const int INF = 2147483647;
  21. int tot = 1, head[_], nxt[__ << 1], ver[__ << 1], cap[__ << 1];
  22. inline void Add_edge(int u, int v, int d)
  23. { nxt[++tot] = head[u], head[u] = tot, ver[tot] = v, cap[tot] = d; }
  24. inline void link(int u, int v, int d) { Add_edge(u, v, d), Add_edge(v, u, 0); }
  25. int n, m, k, s, t, dep[_], cur[_];
  26. struct node { int u, v, d; } x[2452];
  27. inline int id(int u, int d) { return u + (d - 1) * n; }
  28. inline int bfs() {
  29. static queue < int > Q;
  30. memset(dep, 0, sizeof dep);
  31. dep[s] = 1, Q.push(s);
  32. while (!Q.empty()) {
  33. int u = Q.front(); Q.pop();
  34. for (rg int i = head[u]; i; i = nxt[i]) {
  35. int v = ver[i];
  36. if (dep[v] == 0 && cap[i] > 0)
  37. dep[v] = dep[u] + 1, Q.push(v);
  38. }
  39. }
  40. return dep[t] > 0;
  41. }
  42. inline int dfs(int u, int flow) {
  43. if (u == t) return flow;
  44. for (rg int& i = cur[u]; i; i = nxt[i]) {
  45. int v = ver[i];
  46. if (dep[v] == dep[u] + 1 && cap[i] > 0) {
  47. int res = dfs(v, min(flow, cap[i]));
  48. if (res) { cap[i] -= res, cap[i ^ 1] += res; return res; }
  49. }
  50. }
  51. return 0;
  52. }
  53. inline int Dinic(int day) {
  54. int res = 0;
  55. while (bfs()) {
  56. cur[s] = head[s], cur[t] = head[t];
  57. for (rg int x = 1; x <= day; ++x)
  58. for (rg int i = 1; i <= n; ++i)
  59. cur[id(i, x)] = head[id(i, x)];
  60. while (int d = dfs(s, INF)) res += d;
  61. }
  62. return res;
  63. }
  64. int main() {
  65. #ifndef ONLINE_JUDGE
  66. freopen("in.in", "r", stdin);
  67. #endif
  68. read(n), read(m), read(k);
  69. for (rg int i = 1; i <= m; ++i)
  70. read(x[i].u), read(x[i].v), read(x[i].d);
  71. s = _ - 1, t = _ - 2;
  72. link(s, id(1, 1), INF);
  73. link(id(n, 1), t, INF);
  74. int res = 0;
  75. for (rg int d = 2; ; ++d) {
  76. for (rg int i = 1; i <= m; ++i)
  77. link(id(x[i].u, d - 1), id(x[i].v, d), x[i].d);
  78. for (rg int i = 1; i < n; ++i)
  79. link(id(i, d - 1), id(i, d), INF);
  80. link(id(n, d), id(n, d - 1), INF);
  81. res += Dinic(d);
  82. if (res >= k) { printf("%d\n", d - 1); return 0; }
  83. }
  84. return 0;
  85. }

完结撒花 \(qwq\)

「JSOI2008」Blue Mary的旅行的更多相关文章

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

    [BZOJ1570][JSOI2008]Blue Mary的旅行 Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决 ...

  2. bzoj1570: [JSOI2008]Blue Mary的旅行(二分+网络流)

    1570: [JSOI2008]Blue Mary的旅行 题目:传送门 题解: get到拆点新姿势,还是做题太少了...ORZ 因为每天就只能有一个航班,那就不能直接连了,所以要拆点(然后就被卡住了) ...

  3. bzoj 1570: [JSOI2008]Blue Mary的旅行

    Description 在一段时间之后,网络公司终于有了一定的知名度,也开始收到一些订单,其中最大的一宗来自B市.Blue Mary决定亲自去签下这份订单.为了节省旅行经费,他的某个金融顾问建议只购买 ...

  4. [JSOI2008] [BZOJ1567] Blue Mary的战役地图 解题报告 (hash)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1567 Description Blue Mary最近迷上了玩Starcraft(星际争霸 ...

  5. BZOJ1570 [JSOI2008]Blue Mary的旅行

    建分层图,每一层表示一天的情况 从S向第0层的1号点连边,每层的n向T连INF的边 枚举天数,每多一天就多建一层然后跑最大流,如果当前流量大于人数则输出答案 由于路径长度不会超过n,因此tot个人走这 ...

  6. BZOJ 1570: [JSOI2008]Blue Mary的旅行( 二分答案 + 最大流 )

    二分答案, 然后对于答案m, 把地点分成m层, 对于边(u, v), 第x层的u -> 第x+1层的v 连边. 然后第x层的u -> 第x+1层的u连边(+oo), S->第一层的1 ...

  7. [JSOI2008]Blue Mary的旅行

    嘟嘟嘟 看\(n\)那么小,就知道是网络流.然后二分,按时间拆点. 刚开始我看成所有航班一天只能起飞一次,纠结了好一会儿.但实际上是每一个航班单独考虑,互不影响. 建图很显然,拆完点后每一个点的第\( ...

  8. 【bzoj1507】 JSOI2008—Blue Mary的旅行

    http://www.lydsy.com/JudgeOnline/problem.php?id=1570 (题目链接) 题意 给出$m$个航班,每天只能做一次飞机,有$T$人从起点到终点,问最晚到达的 ...

  9. LG1198/BZOJ1012 「JSOI2008」最大数 线段树+离线

    问题描述 LG1198 BZOJ1012 题解 我们把所有操作离线,设一共有\(n\)个插入操作. 于是提前建立\(n\)个数,全部设为\(-INF\) 接着逐个处理操作即可. \(\mathrm{C ...

随机推荐

  1. 201771010135杨蓉庆《面向对象程序设计(java)》第六周学习总结

    实验六 继承定义与使用 1.实验目的与要求 (1) 理解继承的定义: (2) 掌握子类的定义要求 (3) 掌握多态性的概念及用法: (4) 掌握抽象类的定义及用途: (5) 掌握类中4个成员访问权限修 ...

  2. 寒假pta二

    整除光棍 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可以被13整除. 现在 ...

  3. CodeForces-220B Little Elephant and Array

    小象喜欢玩数组.他有一个数组a,由n个正整数组成,从1到n进行索引.让我们用索引i表示数字ai. 此外,小象对数组还有m个查询,每个查询的特征是一对整数lj和rj(1 ≤ lj ≤ rj ≤ n).对 ...

  4. 再次立个flag

    今天2019.9.18 从上次迷茫到现在,差不多过去快一年了.   准确点是 442 天 我顺便大概看了一下上次迷茫时期的日志,总觉的不可思议.上次是毕业大概几个月,到目前其实也没多久,但是我变了.. ...

  5. C++ STL之unordered_map和unordered_set的使⽤

    写在最前面,本文摘录于柳神笔记: unordered_map 在头⽂件 #include <unordered_map> 中, unordered_set 在头⽂件 #include &l ...

  6. 研究Zookeeper的原理(二)

    阅读声明:以下内容是结合网上材料及工作内容所写的个人理解,如有不当,欢迎大家指正~~~谢谢啦 一.ZooKeeper的选举机制.FailOver机制 我们知道ZooKeeper在分布式环境中协调服务, ...

  7. 图书商城(基于Jsp+Servlet)

    这个项目主要是加深一下对于servlet和jsp知识相关的了解以及简单业务逻辑的处理. 用户更新的逻辑: 1.点击修改用户的那一行可以获取到用户的id 2.跳转到一个servlet,去查询该用户的基本 ...

  8. 02.当构造参数过多时使用builder模式

    前言 <Effective Java>中文第三版,是一本关于Java基础的书,这本书不止一次有人推荐我看.其中包括我很喜欢的博客园博主五月的仓颉,他曾在自己的博文<给Java程序猿们 ...

  9. VB.NET中Sub和Function的区别

    function是函数,sub是子程序,都可以传递参数,但函数有返回值,子程序没有 function 可以用自身名字返回一个值,sub 需定义别的变量,用传址方式传回值. Sub 过程与Functio ...

  10. 变量的注释(python3.6以后的功能)

    有时候导入模块,然后使用这个变量的时候,却没点出后面的智能提示.用以下方法可以解决:https://www.cnblogs.com/xieqiankun/p/type_hints_in_python3 ...