(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

题意:传送门

 原题目描述在最下面。

 次短路裸题。

思路:

 在dijstra的过程过维护两个数组变量:\(dis1[],dis2[]\)。分别表示到达\(i\)节点的最短距离和次短距离。

 如果当前距离大于次短距离,则更新次短距离。如果更新后次短距离小于最短距离,就交换二者的值。到最后两个数组值就更新就完成了。

AC代码:

dijkstra

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<map>
  6. #include<queue>
  7. #include<set>
  8. #include<string>
  9. #include<cmath>
  10. #define test printf("***\n")
  11. #define ka getchar();getchar()
  12. #define ka1 getchar()
  13. #define iis std::ios::sync_with_stdio(false)
  14. using namespace std;
  15. typedef long long LL;
  16. const int N = 100005;
  17. const int INF = 0x3f3f3f3f;
  18. const LL mod = 10000;
  19. const double eps = 1e-8;
  20. struct lp{
  21. int to;
  22. LL w;
  23. lp(int a,LL b){to=a;w=b;}
  24. bool operator <(const lp &a)const {
  25. if(w!=a.w) return w>a.w;
  26. return to<a.to;
  27. }
  28. };
  29. vector<lp>mp[N];
  30. LL dis1[N],dis2[N];
  31. int n,m;
  32. void init(){
  33. for(int i=0;i<=n;++i)mp[i].clear();
  34. }
  35. void dij(int s){
  36. memset(dis1,0x3f,sizeof(dis1));
  37. memset(dis2,0x3f,sizeof(dis2));
  38. dis1[s]=0;
  39. priority_queue<lp>Q;
  40. Q.push(lp(s,0));
  41. while(!Q.empty() ){
  42. lp x=Q.top();Q.pop();
  43. int u=x.to;
  44. if(dis2[u]<x.w)continue;
  45. for(int i=0;i<mp[u].size();++i){
  46. lp y=mp[u][i];
  47. if(dis2[y.to]>(x.w+y.w)){
  48. dis2[y.to]=x.w+y.w;
  49. Q.push(lp(y.to,dis2[y.to]));
  50. }
  51. if(dis2[y.to]<dis1[y.to]){
  52. swap(dis2[y.to],dis1[y.to]);
  53. }
  54. }
  55. }
  56. printf("%lld\n",dis2[n]);
  57. }
  58. int main(){
  59. int t;
  60. scanf("%d",&t);
  61. while(t--){
  62. int a,b,c;
  63. scanf("%d%d",&n,&m);
  64. init();
  65. for(int i=0;i<m;++i){
  66. scanf("%d%d%d",&a,&b,&c);
  67. mp[a].push_back(lp(b,c));
  68. mp[b].push_back(lp(a,c));
  69. }
  70. dij(1);
  71. }
  72. return 0;
  73. }

A*

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<assert.h>
  5. #include<bitset>
  6. #include<vector>
  7. #include<queue>
  8. #define lson rt<<1
  9. #define rson rt<<1|1
  10. #define lowbit(x) (x)&(-(x))
  11. #define all(x) (x).begin(),(x).end()
  12. #define mk make_pair
  13. #define pb push_back
  14. #define fi first
  15. #define se second
  16. using namespace std;
  17. typedef long long LL;
  18. const LL INF = 0x3f3f3f3f3f3f3f3f;
  19. const int N = (int)1e5 +107;
  20. int n, m, k, st, ed;
  21. int vis[N],time[N];
  22. LL dis[N];
  23. struct lp{
  24. LL f,g;
  25. int v;
  26. friend bool operator <(const lp &a,const lp &b){
  27. if(a.f==b.f)return a.g>b.g;
  28. return a.f>b.f;
  29. }
  30. }aa,bb;
  31. struct lh{
  32. int v,nex;
  33. LL w;
  34. }cw[200000+5],rev[200000+5];
  35. int head[N],tot,headd[N],tum;
  36. int q[2500005];
  37. void add(int u,int v,LL w){
  38. cw[++tot].v=v;cw[tot].nex=head[u];cw[tot].w=w;
  39. head[u]=tot;
  40. rev[++tum].v=u;rev[tum].nex=headd[v];rev[tum].w=w;
  41. headd[v]=tum;
  42. }
  43. void spfa(){
  44. for(int i = 1; i <= n; i++) dis[i] = INF;
  45. memset(vis, 0, sizeof(vis));
  46. int h = 0, t = 1;
  47. q[0] = ed;
  48. dis[ed] = 0;
  49. while(h < t){
  50. int u = q[h++];
  51. vis[u] = 0;
  52. for(int i = headd[u] ; ~i ; i = rev[i].nex){
  53. int v = rev[i].v;
  54. LL w = rev[i].w;
  55. if(dis[v] > dis[u] + w){
  56. dis[v] = dis[u] + w;
  57. if(!vis[v]){
  58. q[t++] = v;
  59. vis[v] = 1;
  60. }
  61. }
  62. }
  63. }
  64. }
  65. LL Astar(){
  66. if(dis[st]==INF)return -1;
  67. memset(time,0,sizeof(time));
  68. aa.v=st;aa.f=dis[st];aa.g=0;
  69. priority_queue<lp>Q;
  70. Q.push(aa);
  71. while(!Q.empty()){
  72. bb = Q.top();Q.pop();
  73. int u = bb.v;
  74. time[u]++;
  75. if(time[u]==k&&u==ed)return bb.g;
  76. if(time[u]>k)continue;
  77. for(int i=head[u];~i;i=cw[i].nex){
  78. int v = cw[i].v;
  79. aa.v = v;
  80. aa.g=bb.g+cw[i].w;
  81. aa.f=aa.g+dis[v];
  82. Q.push(aa);
  83. }
  84. }
  85. return -1;
  86. }
  87. int main(){
  88. int tim;
  89. scanf("%d",&tim);
  90. while(tim--){
  91. scanf("%d%d", &n, &m);
  92. tot=tum=-1;
  93. memset(head,-1,sizeof(head));
  94. memset(headd,-1,sizeof(headd));
  95. for(int i = 0, u, v; i < m; ++i){
  96. LL w;
  97. scanf("%d%d%lld", &u, &v, &w);
  98. add(u,v,w);add(v,u,w);
  99. }
  100. st=1;ed=n;
  101. k=2;
  102. spfa();
  103. if(st == ed)k++;
  104. printf("%lld\n", Astar());
  105. }
  106. return 0;
  107. }

####原题目描述:
![这里写图片描述](https://img-blog.csdn.net/20180727170400262?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTk5MDY3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<map>
  6. #include<queue>
  7. #include<set>
  8. #include<string>
  9. #include<cmath>
  10. #define test printf("***\n")
  11. #define ka getchar();getchar()
  12. #define ka1 getchar()
  13. #define iis std::ios::sync_with_stdio(false)
  14. using namespace std;
  15. typedef long long LL;
  16. const int N = 100005;
  17. const int INF = 0x3f3f3f3f;
  18. const LL mod = 10000;
  19. const double eps = 1e-8;
  20. struct lp{
  21. int to;
  22. LL w;
  23. lp(int a,LL b){to=a;w=b;}
  24. bool operator <(const lp &a)const {
  25. if(w!=a.w) return w>a.w;
  26. return to<a.to;
  27. }
  28. };
  29. vector<lp>mp[N];
  30. LL dis1[N],dis2[N];
  31. int n, m, pre[N];
  32. void init(){
  33. for(int i=0;i<=n;++i)mp[i].clear();
  34. }
  35. void dij(int s,LL *dis){
  36. dis[s]=0;
  37. priority_queue<lp>Q;
  38. Q.push(lp(s,0));
  39. while(!Q.empty() ){
  40. lp x=Q.top();Q.pop();
  41. int u=x.to;
  42. for(int i=0;i<mp[u].size();++i){
  43. lp y=mp[u][i];
  44. if(dis[y.to]>(x.w+y.w)){
  45. dis[y.to]=x.w+y.w;
  46. pre[y.to]=u;
  47. Q.push(lp(y.to,dis[y.to]));
  48. }
  49. }
  50. }
  51. }
  52. int main(){
  53. int t;
  54. scanf("%d",&t);
  55. while(t--){
  56. int a,b,c;
  57. scanf("%d%d",&n,&m);
  58. init();
  59. for(int i=0;i<m;++i){
  60. scanf("%d%d%d",&a,&b,&c);
  61. mp[a].push_back(lp(b,c));
  62. mp[b].push_back(lp(a,c));
  63. }
  64. memset(dis1,0x3f,sizeof(dis1));
  65. memset(dis2,0x3f,sizeof(dis2));
  66. dij(n,dis2);
  67. memset(pre,0,sizeof(pre));
  68. dij(1,dis1);
  69. LL ans = 1e18;
  70. for(int i=1;i<=n;++i){
  71. for(int j=0;j<mp[i].size();++j){
  72. int v= mp[i][j].to;
  73. LL tmp =dis1[i]+dis2[v]+mp[i][j].w;
  74. if(pre[v]!=i){
  75. if(tmp<ans){
  76. ans=tmp;
  77. }
  78. }
  79. }
  80. }
  81. printf("%lld\n", ans);
  82. }
  83. return 0;
  84. }

HDU6181-求解次短路-A*或者dijkstra的更多相关文章

  1. ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  2. Bellman-ford算法、SPFA算法求解最短路模板

    Bellman-ford 算法适用于含有负权边的最短路求解,复杂度是O( VE ),其原理是依次对每条边进行松弛操作,重复这个操作E-1次后则一定得到最短路,如果还能继续松弛,则有负环.这是因为最长的 ...

  3. ACM - 最短路 - AcWing 849 Dijkstra求最短路 I

    AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...

  4. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  5. BZOJ-1922 大陆争霸 多限制、分层图最短路 (堆+dijkstra)

    1922: [Sdoi2010]大陆争霸 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1154 Solved: 478 [Submit][Status ...

  6. POJ 1797 Heavy Transportation 最短路变形(dijkstra算法)

    题目:click here 题意: 有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量.分析: 其实这个求最大边可以 ...

  7. 最短路算法之Dijkstra算法通俗解释

    Dijkstra算法 说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图. 来,看图. 用邻接矩阵表示 int[][] m = { {0, 0, 0, 0, 0, 0}, {0, 0, ...

  8. 【最短路算法】Dijkstra+heap和SPFA的区别

    单源最短路问题(SSSP)常用的算法有Dijkstra,Bellman-Ford,这两个算法进行优化,就有了Dijkstra+heap.SPFA(Shortest Path Faster Algori ...

  9. CCPC-Wannafly Winter Camp Day1 Div1 - 爬爬爬山 - [最短路][堆优化dijkstra]

    题目链接:https://zhixincode.com/contest/3/problem/F?problem_id=39 样例输入 1  4 5 1 1 2 3 4 1 2 1 1 3 1 1 4 ...

  10. 基础最短路(模板 dijkstra)

    Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...

随机推荐

  1. leetcood学习笔记-35-二分法

    题目: 第一次提交; class Solution: def searchInsert(self, nums: List[int], target: int) -> int: for i in ...

  2. Delphi ResourceString的用法

    在Delphi编程的那段“古老”的日子里(就是在版本4之前),在程序中使用字符串有两个基本的方法.你可以使用字符串将它们嵌入到源程序中,例如: MessageDlg( 'Leave your stin ...

  3. centos修改、保存文件的详细步骤

    [一]修改文件 如果是使用普通用户登录的,需要先切换到管理员用户,打开终端,输入:su,接着按提示输入密码即可:然后使用命令进入需要修改文件的所在目录,常用的几个命令如下: ① cd + 目录名 ② ...

  4. Chrome 调试跨域问题解决方案之插件篇

    跨域,就是A域名下的js,想请求B域名下的接口数据.跨域,只存在于浏览器端.App和小程序不存在跨域问题.跨域,分浏览器策略和服务器策略. 如果服务器配置了允许跨域,那就没有跨域问题 如果uni-ap ...

  5. (转)OpenFire源码学习之十七:HTTP Service插件

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43457645 HTTP Service插件 这里的http接口插件是神马? Openfi ...

  6. 2018ACM-ICPC EC-Final 现场赛I题 Misunderstanding...Missing 倒着DP

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:  很多acm群里有题面PDF了,我就不赘述了.简单说一 ...

  7. qemu的动态翻译机制

    qemu的作者在QEMU, a Fast and Portable Dynamic Translator一文提到了qemu的动态翻译机制, 大致可以总结为如下过程: 目标代码中的一条指令 | |--( ...

  8. PAT_A1080#Graduate Admission

    Source: PAT A1080 Graduate Admission (30 分) Description: It is said that in 2011, there are about 10 ...

  9. 【React-Native】---Android环境配置

    一.前言 本文主要内容是在Window系统下配置Android APP的开发环境,要配置RN的Android开发环境需要3个依赖 1.JDK(版本必须是 1.8) 2.Node(版本必须高于8.3) ...

  10. 前端(十一)—— JavaScript基础:JS存在的位置、JS变量定义、调试方式、JS数据类型、运算符

    JS存在的位置.JS变量定义.调试方式.JS数据类型.运算符 一.JS语言介绍 1.概念 浏览器脚本语言 可以编写运行在浏览器上的代码程序 属于解释性.弱语言类型编程语言 2.组成 ES语法:ECMA ...