最短路

很容易想到边和边之间连边,但是这样菊花图就完蛋了

我们想办法优化一下,能不能不要每条边都连。

考虑查分,把一个点的出边串起来,这样就行了,每条无向边拆成两条就能保证了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 2e5 + ;
  5. namespace IO
  6. {
  7. const int Maxlen = N * ;
  8. char buf[Maxlen], *C = buf;
  9. int Len;
  10. inline void read_in()
  11. {
  12. Len = fread(C, , Maxlen, stdin);
  13. buf[Len] = '\0';
  14. }
  15. inline void fread(int &x)
  16. {
  17. x = ;
  18. int f = ;
  19. while (*C < '' || '' < *C) { if(*C == '-') f = -; ++C; }
  20. while ('' <= *C && *C <= '') x = (x << ) + (x << ) + *C - '', ++C;
  21. x *= f;
  22. }
  23. inline void fread(long long &x)
  24. {
  25. x = ;
  26. long long f = ;
  27. while (*C < '' || '' < *C) { if(*C == '-') f = -; ++C; }
  28. while ('' <= *C && *C <= '') x = (x << ) + (x << ) + *C - '', ++C;
  29. x *= f;
  30. }
  31. inline void read(int &x)
  32. {
  33. x = ;
  34. int f = ; char c = getchar();
  35. while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
  36. while(c >= '' && c <= '') { x = (x << ) + (x << ) + c - ''; c = getchar(); }
  37. x *= f;
  38. }
  39. inline void read(long long &x)
  40. {
  41. x = ;
  42. long long f = ; char c = getchar();
  43. while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
  44. while(c >= '' && c <= '') { x = (x << 1ll) + (x << 3ll) + c - ''; c = getchar(); }
  45. x *= f;
  46. }
  47. } using namespace IO;
  48. int rd()
  49. {
  50. int x = , f = ;
  51. char c = getchar();
  52. while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
  53. while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
  54. return x * f;
  55. }
  56. int n, cnt = , source, sink, m;
  57. int head[N], hd[N * ], st[N], vis[N * ];
  58. ll d[N * ];
  59. struct edge {
  60. int nxt, to, w;
  61. } e[N * ];
  62. bool cmp(int i, int j)
  63. {
  64. return e[i].w < e[j].w;
  65. }
  66. void link(int *head, int u, int v, int w)
  67. {
  68. e[++cnt].nxt = head[u];
  69. head[u] = cnt;
  70. e[cnt].to = v;
  71. e[cnt].w = w;
  72. }
  73. int main()
  74. {
  75. read_in();
  76. fread(n);
  77. fread(m);
  78. for(int i = ; i <= m; ++i)
  79. {
  80. int u, v, w;
  81. fread(u);
  82. fread(v);
  83. fread(w);
  84. link(head, u, v, w);
  85. link(head, v, u, w);
  86. }
  87. source = ;
  88. sink = * m + ;
  89. for(int i = ; i <= n; ++i)
  90. {
  91. int top = ;
  92. for(int j = head[i]; j; j = e[j].nxt) st[++top] = j;
  93. sort(st + , st + top + , cmp);
  94. for(int j = ; j <= top; ++j)
  95. {
  96. int now = st[j], nxt = st[j + ];
  97. if(i == ) link(hd, source, now, e[now].w);
  98. if(e[now].to == n) link(hd, now, sink, e[now].w);
  99. link(hd, now, now ^ , e[now].w);
  100. if(j < top)
  101. {
  102. link(hd, now, nxt, e[nxt].w - e[now].w);
  103. link(hd, nxt, now, );
  104. }
  105. }
  106. }
  107. priority_queue<pair<ll, int>, vector<pair<ll, int> >, greater<pair<ll, int> > > q;
  108. memset(d, 0x3f3f, sizeof(d));
  109. d[source] = ;
  110. q.push({, source});
  111. while(!q.empty())
  112. {
  113. pair<ll, int> o = q.top();
  114. q.pop();
  115. int u = o.second;
  116. if(vis[u]) continue;
  117. vis[u] = ;
  118. for(int i = hd[u]; i; i = e[i].nxt) if(d[e[i].to] > d[u] + e[i].w)
  119. {
  120. d[e[i].to] = d[u] + e[i].w;
  121. q.push({d[e[i].to], e[i].to});
  122. }
  123. }
  124. printf("%lld\n", d[sink]);
  125. return ;
  126. }

bzoj4289的更多相关文章

  1. BZOJ4289 PA2012Tax(最短路)

    一个暴力的做法是把边看成点,之间的边权为两边的较大权值,最短路即可.但这样显然会被菊花图之类的卡掉. 考虑优化建图.将边拆成两个有向边,同样化边为点.原图中同一条边在新图中的两个点之间连边权为原边权的 ...

  2. 【BZOJ-4289】Tax 最短路 + 技巧建图

    4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Dis ...

  3. BZOJ4289 : PA2012 Tax

    一个直观的想法是把每条边拆成两条有向边,同时每条有向边是新图中的一个点.对于两条边a->b与b->c,两点之间连有向边,费用为两条边费用的最大值.然后新建源点S与汇点T,由S向所有起点为1 ...

  4. BZOJ4289 Tax 最短路建模

    给定一个带边权的无向图,求1到n的最小代价路径.经过一个点的代价是路径上这个点的入边和出边的较大权值. \(n \le 100000, m \le 200000\). 一般的建图是考虑每个点,其入边和 ...

  5. bzoj4289 Tax

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

  6. [BZOJ4289][PA2012]TAX(最短路)

    首先考虑一种暴力做法,为每条边拆成两条有向边,各建一个点.若某两条边有公共点,则在边所对应的点之间连一条边,权值为两条边中的较大值.这样跑最短路是$O(m^2\log m)$的. 用类似网络流中补流的 ...

  7. [Bzoj4289]PA2012 Tax(Dijkstra+技巧建图)

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

  8. 【PA2012】【BZOJ4289】Tax

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

  9. bzoj4289 PA2012 Tax——点边转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 好巧妙的转化!感觉自己难以想出来... 参考了博客:https://blog.csdn ...

随机推荐

  1. Spring MVC访问静态资源

    http://www.cnblogs.com/yank/p/4477204.html SpringMVC访问静态资源 在SpringMVC中常用的就是Controller与View.但是我们常常会需要 ...

  2. iOS GCD使用

    Grand Central Dispatch(GCD)是异步运行任务的技术之中的一个. 一般将应用程序中记述的线程管理用的代码在系统级中实现.开发人员仅仅须要定义想运行的任务并追加到适当的Dispat ...

  3. enter键触发的函数

    enter键触发的函数示例: <input type="text" onkeydown="fun();"> function fun() { if( ...

  4. 将iconv编译成lua接口

    前一篇博文说了.在cocos2dx中怎么样使用iconv转码,这节我们将上一节中写的转码函数,做成一个lua接口.在lua脚本中使用. 网上能够下载到luaconv.可是编译的时候总是报错,所以自己写 ...

  5. 再过半小时,你就能明白kafka的工作原理了

    本文在个人技术博客不同步发布,详情可猛戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息" ...

  6. 何时使用Entity或DTO

    关注公众号: 锅外的大佬 每日推送国外优秀的技术翻译文章,励志帮助国内的开发者更好地成长! JPA和Hibernate允许你在JPQL和Criteria查询中使用DTO和Entity作为映射.当我在我 ...

  7. 基于LRU Cache的简单缓存

    package com.test.testCache; import java.util.Map; import org.json.JSONArray; import org.json.JSONExc ...

  8. Graphics and Animation in iOS

     using System;using UIKit;using CoreGraphics;using Foundation; namespace GraphicsAnimation{ public c ...

  9. Microsoft Visual Studio 2013 已停止工作的解决方法

    VS最近莫名奇妙老师崩溃,每次只能修复以后才能正常使用, 后参考 http://www.jb51.net/softjc/226465.html 网页的介绍, 恍然:之前使用OSchina GIT 服务 ...

  10. 【BZOJ3566】[SHOI2014]概率充电器 期望+树形DP

    [BZOJ3566][SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线 ...