1 A*算法

A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的:

其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。另外定义h'(n)为n到目标节点最佳路径的实际值。如果h'(n)≥h(n)则如果存在从初始状态走到目标状态的最小代价的解,那么用该估价函数搜索的算法就叫A*算法。

2 第K最短路的算法

我们设源点为s,终点为t,我们设状态f(i)的g(i)为从s走到节点i的实际距离,h(i)为从节点i到t的最短距离,从而满足A*算法的要求,当第K次走到f(n-1)时表示此时的g(n-1)为第K最短路长度。C++代码如下:()

CDOJ找的一道例题:(模板题)这里面用到SPFA算法(这是中国人创造的,用于求单源最短路的一种算法,关于SFPA时间复杂度的问题,,,不确定性,有时很大,有时很小,emmmm,貌似外国人不太认可,)

Time Limit: 10000 MS     Memory Limit: 256 MB

Submit Status

6·1即将来临,游乐园推出了新的主题活动,雨过天晴,帆宝乐爷童心未泯,准备一探究竟。

兴奋的他们一入园便和孩子们打成一片,不知不觉便走散了。

当他们意识到的时候,只能通过手机来确认对方的位置。

他们当然想尽快找到对方,然而由于孩子们实在是太多,只能选择距离稍远的但是游客稀少的路会合。

帆宝希望找到第kk短的路径,这条路径是他认为的幸运路径。

帆宝迫切地想知道该条路径的长度,而乐于助人的你也一定会帮助她的。

Input

第一行三个整数n,m,kn,m,k,分别表示游乐园的景点数目、景点之间的道路数目以及路径长度从小到大排列时希望选择的序号。

第二行两个整数S,TS,T,分别表示帆宝乐爷所在景点的编号。

接下来mm行,每行三个整数u,v,wu,v,w,表示编号为uu和vv的景点之间有一条长度为ww的单向通路。

1≤n≤1000,0≤m≤100000,1≤k≤1000,1≤S,T,u,v≤N,1≤w≤1001≤n≤1000,0≤m≤100000,1≤k≤1000,1≤S,T,u,v≤N,1≤w≤100

Output

第一行一个整数xx,表示所选路径的长度

无解输出−1−1

Sample input and output

Sample Input Sample Output
  1. 3 3 2
  2. 1 2
  3. 1 2 2
  4. 1 3 4
  5. 3 2 1
  1. 5

题意:给你起点,终点以及要求的第K短路;

题解:首先将有向图以终点T为起点,计算出T到每一个边的最短距离(到第i条边dis[i]),

然后建立一个优先队列,从优先队列中弹出f(p)最小的点p,如果p就是T,则T的次数加一。如果当前次数等于K则当前路即为地K小

的路,,否则,,便利每一个p 所连的边,将其扩张出的到p临接点的信息加入到优先队列中;

AC代码:

  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3. using namespace std;
  4. const int AX = 1e5+;
  5. const int MAXN = 1e3+;
  6. int n,m,k;
  7. int s,t;
  8. int tot;
  9. int retot;
  10. struct edge{
  11. int to,w;
  12. int next1;
  13. }G[AX],RG[AX];
  14.  
  15. struct Node{
  16. int v;
  17. int f,h,g;
  18. bool operator < (const Node &a) const{ return f==a.f? g>a.g : f>a.f; }
  19. };
  20.  
  21. int dis[MAXN];
  22. int head[MAXN];
  23. int rehead[AX];
  24. int vis[MAXN];
  25.  
  26. void add_edge(int u,int v,int c)
  27. {
  28. G[tot].to=v;
  29. G[tot].w=c;
  30. G[tot].next1=head[u];
  31. head[u]=tot++;
  32.  
  33. RG[retot].to=u;
  34. RG[retot].w=c;
  35. RG[retot].next1=rehead[v];
  36. rehead[v]=retot++;
  37. }
  38. void SPFA()
  39. {
  40. for(int i=;i<=n;i++) dis[i]=INF;
  41. dis[t]=;
  42. queue<int> Q;
  43. Q.push(t);
  44. while(!Q.empty())
  45. {
  46. int u=Q.front();
  47. Q.pop();
  48. for(int i=rehead[u];i!=-;i=RG[i].next1)
  49. {
  50. int v=RG[i].to ;
  51. int w=RG[i].w ;
  52. if(dis[v]>dis[u]+w)
  53. {
  54. dis[v]=dis[u]+w;
  55. Q.push(v);
  56. }
  57. }
  58. }
  59. }
  60.  
  61. int Astar(Node a)
  62. {
  63. memset(vis,,sizeof(vis));
  64. if(dis[s]==INF) return -;//如果没有与S相连的点
  65. if(s==t) k++;
  66. priority_queue<Node> Q;
  67. Q.push(a);
  68. while(!Q.empty())
  69. {
  70. Node tmp=Q.top();
  71. Q.pop();
  72. int v=tmp.v;
  73. vis[v]++;
  74. if(vis[t]==k) return tmp.g;
  75. for(int i=head[v];i!=-;i=G[i].next1)
  76. {
  77. Node p;
  78. p.v=G[i].to;
  79. p.h=dis[G[i].to];
  80. p.g=tmp.g+G[i].w;
  81. p.f=p.g+p.h;
  82. Q.push(p);
  83. }
  84. }
  85. return -;
  86. }
  87.  
  88. int main()
  89. {
  90. tot=;
  91. retot=;
  92. memset(head,-,sizeof head);
  93. memset(rehead,-,sizeof rehead);
  94. scanf("%d%d%d",&n,&m,&k);
  95. scanf("%d%d",&s,&t);
  96. int x,y,w;
  97. for(int i=;i<m;i++)
  98. {
  99. scanf("%d%d%d",&x,&y,&w);
  100. add_edge(x,y,w);
  101. }
  102. SPFA();
  103. Node a;
  104. a.v=s;
  105. a.g=;
  106. a.h=dis[s];
  107. a.f=a.g+a.h;
  108. int g=Astar(a);
  109. printf("%d\n",g);
  110. return ;
  111. }

后面我还会更新出 关于启发式搜索的讲解,以及Dijkstra,,SPFA,Folyd这三种关于不同最短路问题讲解及例题分析。

越努力,越幸运!    加油!!!

A*算法在最短路问题的应用及其使用举例的更多相关文章

  1. 最短路问题的三种算法&模板

    最短路算法&模板 最短路问题是图论的基础问题.本篇随笔就图论中最短路问题进行剖析,讲解常用的三种最短路算法:Floyd算法.Dijkstra算法及SPFA算法,并给出三种算法的模板.流畅阅读本 ...

  2. 用Apache Ant在Weka中嵌入新算法

    本文将介绍一种新的添加新的算法到Weka中的方法,国内的论坛基本都是通过IDE(Eclipse或NetBeans)编译,详细教程请见上一篇博客.经研究,发现国外的网站很流行用Ant这个方法,教程奉上. ...

  3. 用Eclipse在Weka中嵌入新算法

    本文介绍添加一个新算法到Weka集成环境中的过程,并能在GUI中运行并显示其结果.想做到这一点有两种方法,一是用ANT命令生成新的weka.jar(稍后写教程),二是用IDE(Eclipse或NetB ...

  4. HDU--杭电--3790--最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. POJ 2472 106 miles to Chicago(Dijstra变形——史上最坑的最长路问题)

    题目链接 :http://poj.org/problem?id=2472 Description In the movie "Blues Brothers", the orphan ...

  6. java学会需要掌握的知识(来源网上。。)

    Java就业指导 2016-03-22 骆昊 程序人生 点击上方"程序人生"关注我们 想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些 ...

  7. C++拾遗

    1三个概念 字符串字面值是一串常量字符(是一个常量),字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.字符串字面值的类型 ...

  8. springMVC web项目 对访问数据库的用户名密码进行加密解密

    在使用springMVC开发web项目中,数据库的用户名,密码一般都是配置在.properties文件中 然后在通过.xml配置文件引入.properties的变量,例如 在config.proper ...

  9. Adaboost总结

    一.简介 Boosting 是一类算法的总称,这类算法的特点是通过训练若干弱分类器,然后将弱分类器组合成强分类器进行分类.为什么要这样做呢?因为弱分类器训练起来很容易,将弱分类器集成起来,往往可以得到 ...

随机推荐

  1. linux-mysql8的安装步骤详解及需要注意的坑

    (本文由言念小文原创,转载请注明出处) 前言 最近安装mysql8时,遇到了一些问题,记录下来作为以后操作指导资料. Linux上mysql安装方法个人目前使用的有两种: 一种是基于rpm安装: 另一 ...

  2. Zabbix-(一) 安装与部署

    Zabbix-(一)安装与部署 一.前言 本文记录在Centos7.6平台 通过yum安装部署Zabbix 4.4 准备 Centos7.6 虚拟机一台(ip: 192.168.152.140) My ...

  3. CSS(7)--- 通俗讲解清除浮动

    CSS(7)--- 通俗讲解清除浮动 上一篇讲了CSS浮动 博客地址:CSS(6)---通俗讲解浮动(float) 一.理解清除浮动 1.为什么要清除浮动 我们前面说过,浮动本质是用来做一些文字混排效 ...

  4. 【微信小程序】踩坑指南(持续更新)

    前言 说明: 基于mpvue框架:mpvue官方文档 语法同vue框架:vue官方文档 小程序中会有一些坑点,这里会就工作中遇到的坑一一列举出来 无说明时请直接看代码注释 v-show无法使用在小程序 ...

  5. 三张关联表,大表;单次查询耗时400s,有group by order by 如何优化

    问题SQL: select p.person_id as personId, p.person_name as personName, p.native_place as nativePlace, c ...

  6. Mssql 查询某记录前后N条

    Sqlserver 查询指定记录前后N条,包括当前数据 条件 [ID] 查询 [N]条 select * from [Table] where ID in (select top ([N]+1) ID ...

  7. 利用Xshell配置ssh免密码登录虚拟机,进行虚拟机与物理机的传输

    先说一下 Xshell如何无密连接虚拟机: ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux的方法.使用 ...

  8. 领扣(LeetCode)检测大写字母 个人题解

    给定一个单词,你需要判断单词的大写使用是否正确. 我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如"USA". 单词中所有字母都不是大写,比如"l ...

  9. LVM弹性硬盘

    LVM机制的基本概念 PV(物理卷) ----由多个pe组成 VG(卷组) LV(逻辑卷) 基本命令: 如: 服务器新增一块大小为1T的SCSI的硬盘(sdb) ,创建一个名字为(ceshi)的逻辑分 ...

  10. PostGIS 报错为org.postgresql.util.PSQLException:错误: Operation on mixed SRID geometries

    说明: 在用Openlayers与Geoserver进行开发,做在线编辑功能时,出现一个问题:每当我新增了一根要素后,再次用wfs的方式进行点击查询时,会报错mixed SRID. 通过研究发现在数据 ...