点这里看题目

3228K 485MS G++ 2453B

根据题意和测试用例知道这是一个求次短路径的题目。次短路径,就是比最短路径长那么一丢丢的路径,而题中又是要求从一点到指定点的次短路径,果断Dijkstra。

R (1 ≤ R ≤ 100,000,N (1 ≤ N ≤ 5000) ,length D (1 ≤ D ≤ 5000),所以我用链式向前星方法存储,这个不知道的点这里(我转载别人的,讲的挺详细)。

用一个二维数组dist[MAXN][2],去记录i->j的最短路径和次短路径,第二维是0表示当期拿记录最短边,是1表示当前记录次短边。思路是这样,dist初始值为INF,当if(!vis[j][0] && dis[j][0] < MIN),即找到最短边,标记下来;如果 else if(!vis[j][1] && dis[j][1] < MIN),则是次短边,标记下来。所后进行松弛操作。。。。

  1. /*************************************************************************
  2. > File Name: poj3255.cpp
  3. > Author: YeGuoSheng
  4. > Description:
  5. 给定n个点和需要到达的点编号
  6. 问从1号点到目标点的次短路径
  7. > Created Time: 2019年07月21日 星期日 16时40分46秒
  8. ************************************************************************/
  9.  
  10. #include<iostream>
  11. #include<stdio.h>
  12. #include<cstring>
  13. #include<cmath>
  14. #include<stack>
  15. #include<map>
  16. #include<set>
  17. #include<list>
  18. #include<queue>
  19. #include<string>
  20. #include<algorithm>
  21. #include<iomanip>
  22. #define INF 0x3f3f3f3f
  23. #define MAXN 50010
  24.  
  25. struct node
  26. {
  27. int v;
  28. int next;
  29. int w;
  30. }edges[MAXN<<];
  31.  
  32. int head[MAXN];
  33. int cnt;
  34. int dis[MAXN][];//dist [i][0]:1 最短路径 ,dist[i][1]次短路径
  35. bool vis[MAXN][];//vis[i][0]:1 表示到结点i的最短路径已找到,vis[i][1]表示到结点i的次短路径已找到
  36. int n,m;
  37.  
  38. void add(int u,int v,int w)//链式向前星存储
  39. {
  40. edges[++cnt].v=v;
  41. edges[cnt].w=w;
  42. edges[cnt].next=head[u];
  43. head[u]=cnt;
  44. }
  45.  
  46. void dijkstra(int s)
  47. {
  48. for(int i=;i <= n;i++)
  49. {
  50. dis[i][]=dis[i][]= INF;//dist [i][0] 最短路径 ,dist[i][1]次短路径
  51. vis[i][]=vis[i][]= ;
  52. }
  53. dis[s][] = ;
  54. for(int i = ;i < n*;i++)
  55. {
  56. int MIN = INF;
  57. int k = ;
  58. int flag = ;
  59. for(int j = ;j <= n;j++)
  60. {
  61. if(!vis[j][] && dis[j][] < MIN)
  62. {
  63. MIN=dis[j][];//找到最小边 将点标记
  64. k=j;
  65. flag = ;
  66. }
  67. else if(!vis[j][] && dis[j][] < MIN)//否则找到的就是次短边
  68. {
  69. MIN=dis[j][];
  70. k=j;
  71. flag = ;
  72. }
  73. }
  74. if(MIN == INF)break;//没找到 最短或次短路径
  75. vis[k][flag]=;//标记到结点k的最小边或次短边已经找到
  76. for(int j= head[k];j!=-;j=edges[j].next)
  77. {
  78. int v = edges[j].v;//第j条边的终点
  79. int w = edges[j].w;//这条边的权重
  80. if(MIN+w <= dis[v][])//小于最短边,更新最短边,同时最短边变为次短边
  81. {
  82. dis[v][] = dis[v][];//既然dis[v][0]有更小的,那么我先把原来的赋值给dis[v][1]
  83. dis[v][] = MIN+w;
  84. }
  85. else if(MIN+w <= dis[v][])//如果大于最短边,小于次短边,根新次短边
  86. {
  87. dis[v][] = MIN+w;
  88. }
  89. }
  90. }
  91. }
  92. int main()
  93. {
  94. memset(head,-,sizeof(head));
  95. cnt = ;
  96. scanf("%d%d",&n,&m);// n:目标结点, m:边的数幂
  97. for(int i=;i<=m;i++)
  98. {
  99. int x,y,z;
  100. scanf("%d%d%d",&x,&y,&z);
  101. add(x,y,z);
  102. add(y,x,z);
  103. }
  104. dijkstra();
  105. printf("%d\n",dis[n][]);
  106. return ;
  107. }

POJ3255(Roadblocks)--次短路径的更多相关文章

  1. POJ 3255 Roadblocks --次短路径

    由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小).所以可以枚举每一条边,算出从起点到这条边起 ...

  2. POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)

    Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16425   Accepted: 5797 Descr ...

  3. 【次短路径/SPFA】BZOJ1726-[Usaco2006 Nov]Roadblocks第二短路

    [题目大意] 求无向图点1到n的次短路. [思路] 一年多前写过一次堆优化Dijkstra的,方法就是一边跑Dijsktra一边就把次短路径保存下来.和一般Dijkstra不同的是把vis数组去掉了, ...

  4. 单源次短路径:poj:3255-Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17521 Accepted: 6167 Descripti ...

  5. 学习笔记CB006:依存句法、LTP、n元语法模型、N-最短路径分词法、由字构词分词法、图论、概率论

    依存句法分析,法国语言学家L.Tesniere1959年提出.句法,句子规则,句子成分组织规则.依存句法,成分间依赖关系.依赖,没有A,B存在错误.语义,句子含义. 依存句法强调介词.助词划分作用,语 ...

  6. windows短路径转换成长路径

    参考: https://blog.csdn.net/wxqian25/article/details/43951281 https://docs.microsoft.com/en-us/windows ...

  7. 【dijkstra优化/次短路径】POJ3255-Roadblocks

    [题目大意] 给出一张无向图,求出从源点到终点的次短边. [思路] 先来谈谈Dijkstra的优化.对于每次寻找到当前为访问过的点中距离最短的那一个,运用优先队列进行优化,避免全部扫描,每更新一个点的 ...

  8. POJ - 3255 次短路径

    题意:给你无向带权图,求次短路径 题解:加一个次短路的数组,用于距记录源点到此点的次短路长度,注意初始化是源点到自己的次短路是极大值 接着再使用dijkstra算法,它是每次选用现在连上(记录了)的点 ...

  9. A* 算法求第k短路径

    A*算法是一类贪心算法,其可以用于寻找最优路径.我们可以利用A*算法来求第k短路径. 一条路径可以由两部分组成,第一部分是一个从出发到达任意点的任意路径,而第二部分是从第一部分的末端出发,到终点的最短 ...

随机推荐

  1. 【Mybatis】MyBatis之配置自定义数据源(十一)

    本例是在[Mybatis]MyBatis之配置多数据源(十)的基础上进行拓展,查看本例请先学习第十章 实现原理 1.扩展Spring的AbstractRoutingDataSource抽象类(该类充当 ...

  2. 【Spring】基于@Aspect的AOP配置

    Spring AOP面向切面编程,可以用来配置事务.做日志.权限验证.在用户请求时做一些处理等等.用@Aspect做一个切面,就可以直接实现. ·   本例演示一个基于@Aspect的小demo 1. ...

  3. 【JS】jquery展示JSON插件JSONView

    JSONView介绍 jQuery插件,用于显示漂亮的JSON. 官网地址:https://plugins.jquery.com/jsonview/ git地址:https://github.com/ ...

  4. 使用JSQLParser解析SQL中涉及到的表

    首先添加Maven依赖: <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId& ...

  5. ubuntu18.04安装DB2 11.1 Express-c

    参考连接:https://developer.ibm.com/answers/questions/280797/download-db2-express-c-105-1/ 这个参考页面提供了DB2 E ...

  6. 05点睛Spring MVC 4.1-服务器端推送

    转发:https://www.iteye.com/blog/wiselyman-2214626 5.1 服务器端推送 SSE(server send event)是一种服务器端向浏览器推送消息的技术, ...

  7. DES 指定键的大小对于此算法无效

    KEY (byte[])  长度不为8.  一般KEY使用UTF8编码.  byte[] byKey = Encoding.UTF8.GetBytes(key); 加密内容的编码,由两方协商. Sys ...

  8. Django 之安全篇

    一.CSRF攻击 CSRF攻击概述: CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其 ...

  9. Linux 下 安装 Jmeter

    Linux下安装jmeter 1.1 下载JMeter 官方网站下载最新版本: http://jmeter.apache.org/download_jmeter.cgi    两个只是解压方式不一样而 ...

  10. mysql数据表的编辑

    创建数据表 create  table  [if not  exists] 表名(字段列表, [约束或索引列表]) [表选项列表]; 删除数据表 drop   table  [if  exists] ...