题目传送门

  这是一条通往vjudge的神秘通道

  这是一条通往bzoj的神秘通道

题目大意

  如果一条路径走过的边依次为$e_{1}, e_{2}, \cdots , e_{k}$,那么它的长度为$e_{1} + \max (e_{1}, e_{2}) + \max (e_{2}, e_{3}) + \cdots + \max (e_{k - 1}, e_{k}) + e_{k}$,问点$1$到点$n$的最短路。

  显然需要把状态记在最后一条边上。

  然后给一个菊花图,这个做法就gg了。

  因此考虑一些黑科技。

  可以把边看成点,然后考虑如何在辺与边之间快速连边。

  对于一个点的出边,可以把它们按照权值排序,大的向比它略小的连一条权值为0的边,小的向比它略大的连一天权值为它们边权之差的边。

  然后原图中每条边向它的反向边连一条边权相同的边。

  然后再建两个虚点,一个起点,向以1为起点的边连边,边权不变。一个终点,以$n$为终点的边向它连边。

Code

  1. /**
  2. * bzoj
  3. * Problem#4289
  4. * Accepted
  5. * Time: 3200ms
  6. * Memory: 31292k
  7. */
  8. #include <bits/stdc++.h>
  9. #ifndef WIN32
  10. #define Auto "%lld"
  11. #else
  12. #define Auto "%I64d"
  13. #endif
  14. using namespace std;
  15. typedef bool boolean;
  16.  
  17. #define ll long long
  18.  
  19. typedef class Edge {
  20. public:
  21. int end, next, w;
  22.  
  23. Edge(int end = , int next = , int w = ):end(end), next(next), w(w) { }
  24. }Edge;
  25.  
  26. typedef class MapManager {
  27. public:
  28. int ce;
  29. int *h;
  30. Edge *es;
  31.  
  32. MapManager() { }
  33. MapManager(int n, int m):ce(-) {
  34. h = new int[(n + )];
  35. es = new Edge[(m + )];
  36. memset(h, -, sizeof(int) * (n + ));
  37. }
  38.  
  39. void addEdge(int u, int v, int w) {
  40. es[++ce] = Edge(v, h[u], w);
  41. h[u] = ce;
  42. // cerr << u << "->" << v << " " << w << endl;
  43. }
  44.  
  45. Edge& operator [] (int pos) const {
  46. return es[pos];
  47. }
  48. }MapManager;
  49.  
  50. int n, m;
  51. Edge *es;
  52. vector<int> *dg;
  53. MapManager g;
  54.  
  55. inline void init() {
  56. scanf("%d%d", &n, &m);
  57. es = new Edge[(m + )];
  58. dg = new vector<int>[(n + )];
  59. for (int i = ; i < m; i++) {
  60. scanf("%d%d%d", &es[i].end, &es[i].next, &es[i].w);
  61. dg[es[i].end].push_back(i << );
  62. dg[es[i].next].push_back(i << | );
  63. }
  64. }
  65.  
  66. boolean cmp(const int& a, const int& b) {
  67. return es[a >> ].w < es[b >> ].w;
  68. }
  69.  
  70. int s, t;
  71.  
  72. inline void build() {
  73. g = MapManager((m << ) + , m << );
  74. s = m << , t = m << | ;
  75. for (int i = ; i <= n; i++) {
  76. sort(dg[i].begin(), dg[i].end(), cmp);
  77. for (int j = ; j < (signed) dg[i].size(); j++) {
  78. int u = (j) ? (dg[i][j - ]) : (-), v = dg[i][j];
  79. g.addEdge(v, u, );
  80. g.addEdge(u, v, es[v >> ].w - es[u >> ].w);
  81. }
  82. }
  83.  
  84. for (int i = ; i < (signed) dg[].size(); i++)
  85. g.addEdge(s, dg[][i], es[dg[][i] >> ].w);
  86. for (int i = ; i < (signed) dg[n].size(); i++)
  87. g.addEdge(dg[n][i] ^ , t, es[dg[n][i] >> ].w);
  88.  
  89. for (int i = , w; i < m; i++) {
  90. w = es[i].w;
  91. g.addEdge(i << , i << | , w);
  92. g.addEdge(i << | , i << , w);
  93. }
  94. }
  95.  
  96. typedef class Node {
  97. public:
  98. int p;
  99. ll dis;
  100.  
  101. Node(int p = , ll dis = ):p(p), dis(dis) { }
  102.  
  103. boolean operator < (Node b) const {
  104. return dis > b.dis;
  105. }
  106. }Node;
  107.  
  108. ll *f;
  109. priority_queue<Node> que;
  110. inline ll dijstra() {
  111. f = new ll[(m << ) + ];
  112. memset(f, 0x3f, sizeof(ll) * ((m << ) + ));
  113. que.push(Node(s, f[s] = ));
  114. while (!que.empty()) {
  115. Node e = que.top();
  116. que.pop();
  117. if (e.dis != f[e.p]) continue;
  118. for (int i = g.h[e.p]; ~i; i = g[i].next) {
  119. Node eu (g[i].end, e.dis + g[i].w);
  120. if (eu.dis < f[eu.p]) {
  121. f[eu.p] = eu.dis;
  122. que.push(eu);
  123. }
  124. }
  125. }
  126. return f[t];
  127. }
  128.  
  129. inline void solve() {
  130. printf(Auto"\n", dijstra());
  131. }
  132.  
  133. int main() {
  134. init();
  135. build();
  136. solve();
  137. return ;
  138. }

bzoj 4289 Tax - 最短路的更多相关文章

  1. bzoj 4289 TAX —— 点边转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 把边转化成点,同一个原有点相连的边中,边权小的向大的连差值的边,大的向小的连0的边: ...

  2. 「BZOJ 4289」 PA2012 Tax

    「BZOJ 4289」 PA2012 Tax 题目描述 给出一个 \(N\) 个点 \(M\) 条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点 \(1\) 到点 \( ...

  3. BZOJ 4289: PA2012 Tax 差分建图 最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=4289 https://www.cnblogs.com/clrs97/p/5046933.html  ...

  4. BZOJ 4289: PA2012 Tax(最短路)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 755  Solved: 240[Submit][Status][Discuss] Descriptio ...

  5. ●BZOJ 4289 PA2012 Tax

    ●赘述题目 算了,题目没有重复的必要. 注意理解:对答案造成贡献的是每个点,就是了. 举个栗子: 对于如下数据: 2 1 1 2 1 答案是 2: ●题解 方法:建图(难点)+最短路. 先来几个链接: ...

  6. BZOJ.4289.PA2012 Tax(思路 Dijkstra)

    题目链接 \(Description\) 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价 ...

  7. bzoj 4289 PA2012 Tax——构图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 可以把一个点上的边按权值排序,然后边权小的向第一个比它大的连差值的边,边权大的向第一个 ...

  8. bzoj 4289: PA2012 Tax

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

  9. 【刷题】BZOJ 4289 PA2012 Tax

    Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...

随机推荐

  1. dp入门 石子相邻合并 详细带图讲解

    题目: 有N堆石子,现要将石子有序的合并成一堆,规定如下: 1.每次只能移动相邻的2堆石子合并  2.合并花费为新合成的一堆石子的数量. 求将这N堆石子合并成一堆的总花费最小(或最大). 样例: 输入 ...

  2. VS2013打包程序步骤

    VS自带的打包程序默认是没有安装的,如果有打包的需要,需要自己去下载一个安装程序  1.右击解决方案,选择添加项目,在打开的对话框中找到[已安装]-[模板]-[其他项目]-[安装和部署],如图示.第一 ...

  3. html5-table布局

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. QString字符串中双引号的梗

    [1]QString字符串不支持双引号 最近做项目(本地环境:WIN10 + QT5.9.2 + VS2017).有个需求,需要实现形如 "key="123456"&qu ...

  5. maven 核心概念

    1). 项目构建过程中的各个环节 . 清理 . 编译 . 测试 . 报告 . 打包 . 安装 . 部署 2). 配置环境变量 . 配置 JDK 配置 JAVA_HOME + PATH maven 需要 ...

  6. linux文件系统的用户和权限管理

    1. 为什么要有用户的概念? 多用户,多任务业务对系统资源的隔离产生需求 2. linux 用户的分类? 2.1. 管理员 拥有操作所有文件的权限 2.2. 普通用户 2.2.1. 普通登录用户 2. ...

  7. python os.path.dirname()

    ----返回文件所在的路径 ----如果path变量直接是文件名则返回空

  8. redis相关问题

    什么是Redis?Redis 是一个使用 C 语言写成的,开源的 key-value 数据库..和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

  9. linux lsof用法

    linux lsof命令详解   简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可 ...

  10. 安卓apk的编译与反编译

    原文:https://blog.csdn.net/baidu_33870664/article/details/80186945 android基于java的,而java反编译工具很强悍,所以对正常a ...