题目:

POJ3255

洛谷2865

分析:

这道题第一眼看上去有点懵……

不过既然要求次短路,那估计跟最短路有点关系,所以就拿着优先队列优化的Dijkstra乱搞,搞着搞着就通了。

开两个数组:\(dis\)存最短路,\(dis2\)存次短路

在松弛的时候同时更新两个数组,要判断三个条件

(\(u\)是当前考虑的点,\(v\)是与\(u\)有边相连的点,\(d(u,v)\)表示从\(u\)到\(v\)的边长)

1.如果\(dis[v]>dis[u]+d(u,v)\),则更新\(dis[v]\)

2018.11.09Updated: 同时\(dis2[v]\)应成为原\(dis[v]\)。原代码有误,已更新。

2.如果\(dis[v]<dis[u]+d(u,v)\)(不能取等,否则\(dis2[v]\)和\(dis[v]\)可能相等)且\(dis2[v]>dis[u]+d(u,v)\),则更新\(dis2[v]\)

3.如果\(dis2[v]>dis2[u]+d(u,v)\),则更新\(dis2[v]\)(显然,如果2成立,更新后\(dis2[v]=dis[u]+d(u,v)<dis2[u]+d(u,v)\),即3一定不成立)

如果上述三个条件中有任意一个成立,则将\(v\)入队。

还要注意一个地方:因为次短路可能会走“回头路” (即成环) ,所以一个点可以多次进队,不能使用\(vis\)数组判重。

以及起点的\(dis2\)不能初始化为0,因为起点的次短路一定是沿着与其相连的最短的边走出去再回来。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<cstring>
  5. #include<vector>
  6. using namespace std;
  7. int dis[5010],dis2[5010],n,m;
  8. struct point
  9. {
  10. int id;
  11. int dis;
  12. bool operator<(const point &b)const
  13. {
  14. return dis>b.dis;
  15. }
  16. };
  17. struct edge
  18. {
  19. int to;
  20. int w;
  21. };
  22. priority_queue<point>q;
  23. vector<edge>g[5010];
  24. int main(void)
  25. {
  26. scanf("%d%d",&n,&m);
  27. for(int i=0;i<m;i++)
  28. {
  29. int a,b,c;
  30. scanf("%d%d%d",&a,&b,&c);
  31. g[a].push_back((edge){b,c});
  32. g[b].push_back((edge){a,c});
  33. }
  34. memset(dis,0x3f3f3f3f,sizeof(dis));
  35. memset(dis2,0x3f3f3f3f,sizeof(dis2));
  36. dis[1]=0;
  37. q.push((point){1,0});
  38. while(!q.empty())
  39. {
  40. int u=q.top().id,d=q.top().dis;
  41. q.pop();
  42. if(d>dis2[u])continue;
  43. for(int i=0;i<g[u].size();i++)
  44. {
  45. int v=g[u][i].to,w=g[u][i].w;
  46. bool flag=false;
  47. if(dis[v]>dis[u]+w)
  48. {
  49. dis2[v]=dis[v];
  50. dis[v]=dis[u]+w;flag=true;
  51. }
  52. if(dis[v]<dis[u]+w&&dis2[v]>dis[u]+w)
  53. dis2[v]=dis[u]+w,flag=true;
  54. if(dis2[v]>dis2[u]+w)
  55. dis2[v]=dis2[u]+w,flag=true;
  56. if(flag)q.push((point){v,dis[v]});
  57. }
  58. }
  59. printf("%d",dis2[n]);
  60. return 0;
  61. }

【POJ3255/洛谷2865】[Usaco2006 Nov]路障Roadblocks(次短路)的更多相关文章

  1. 【洛谷 P2865】 [USACO06NOV]路障Roadblocks(最短路)

    题目链接 次短路模板题. 对每个点记录最短路和严格次短路,然后就是维护次值的方法了. 和这题一样. #include <cstdio> #include <queue> #in ...

  2. 洛谷 P5304 [GXOI/GZOI2019]旅行者(最短路)

    洛谷:传送门 bzoj:传送门 参考资料: [1]:https://xht37.blog.luogu.org/p5304-gxoigzoi2019-lv-xing-zhe [2]:http://www ...

  3. 【BZOJ2763/洛谷p4563】【分层图最短路】飞行路线

    2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4630  Solved: 1797[Submit][Stat ...

  4. 洛谷P1462-通往奥格瑞玛的道路-二分+最短路

    洛谷P1462-通往奥格瑞玛的道路 题目描述 在艾泽拉斯,有\(n\)个城市.编号为\(1,2,3,...,n\). 城市之间有\(m\)条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联 ...

  5. BZOJ 1726 洛谷 2865 [USACO06NOV]路障Roadblocks【次短路】

    ·求1到n的严格次短路. [题解] dijktra魔改?允许多次入队,改了次短路的值也要入队. #include<cstdio> #include<algorithm> #de ...

  6. 洛谷P2865 [USACO06NOV]路障Roadblocks——次短路

    给一手链接 https://www.luogu.com.cn/problem/P2865 这道题其实就是在维护最短路的时候维护一下次短路就okay了 #include<cstdio> #i ...

  7. 2018.11.06 洛谷P1099 树网的核(最短路+枚举)

    传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc ...

  8. 2018.08.17 洛谷P3110 [USACO14DEC]驮运(最短路)

    传送门 一道sb最短路,从两个起点和终点跑一边最短路之后直接枚举两人的汇合点求最小值就行了. 代码: #include<bits/stdc++.h> #define N 40005 #de ...

  9. 洛谷 P4011 孤岛营救问题【最短路+分层图】

    题外话:昨夜脑子昏沉,今早一调试就过了...错误有:我忘记还有墙直接穿墙过...memset初始化INF用错了数...然后手残敲错一个状态一直过不了样例...要是这状态去比赛我简直完了......or ...

随机推荐

  1. CCF201703-2 学生排队 java(100分)

    试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...

  2. 【Codeforces 1009C】Annoying Present

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 其实就是让你最后这n个数字的和最大. 加上的x没有关系.因为肯定都是加上n个x 所以直接加上就可以了 主要在于如何选取j 显然我们要找到一个位 ...

  3. 转载 - Struts2基于XML配置方式实现对action的所有方法进行输入校验

    出处:http://www.cnblogs.com/Laupaul/archive/2012/03/15/2398360.html http://www.blogjava.net/focusJ/arc ...

  4. 【BZOJ2342】双倍回文(manacher,并查集)

    题意: 思路:From http://blog.sina.com.cn/s/blog_8d5d2f04010196bh.html 首先我可以看出: (1)我们找到的串的本身也是一个回文串(显然) (2 ...

  5. 洛谷——P1103 书本整理

    https://www.luogu.org/problem/show?pid=1103 题目描述 Frank是一个非常喜爱整洁的人.他有一大堆书和一个书架,想要把书放在书架上.书架可以放下所有的书,所 ...

  6. Nginx源码分析:3张图看懂启动及进程工作原理

    编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享.转载请注明来自高可用架构公众号「ArchNotes」.   导读:很多工程师及架构师都希望了解及掌握高性能服务器 ...

  7. ArcGIS AO中控制图层中要素可见状态的总结

    一.DefinitionExpression 实现新建查询图层,查询结果要素为选中状态 该接口可以通过两种方法来控制要素的可见状态. 思路1 通过该接口的 DefinitionExpression 方 ...

  8. eclipse编译项目用maven编译问题

    1.eclipse只是个ide开发环境,并没有编译器功能.没有编译器.eclipse编译项目只是调jdk本地的java编译器.maven是单独编译,eclipse可以调用maven编译, 在eclip ...

  9. uva 11552 dp

    UVA 11552 - Fewest Flops 一个字符串,字符串每 k 个当作一组,组中的字符顺序能够重组.问经过重组后改字符串能够编程最少由多少块字符组成.连续的一段字符被称为块. dp[i][ ...

  10. golang 的GOPATH设置的问题

    go run footer.go 的时候呢, go会依次去GOPATH 和GOROOT设置的对应路径下面找对应的包(目录和文件) 找的时候呢, 会在GoPATH 和GOROOT对应的目录后面再加一层路 ...