A*算法在最短路问题的应用及其使用举例

 

 

 

1 A*算法

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

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

 

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

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

 

转载于:https://www.cnblogs.com/songorz/p/9386760.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch 使用cpu_想读读PyTorch底层代码?这份内核机制简介送给你

机器之心报道参与&#xff1a;思源学习 PyTorch 比较简单&#xff0c;但你能学习 PyTorch 内部机制吗&#xff1f;最近&#xff0c;有 14 年 ML 经验的大神 Christian 介绍了 PyTorch 的内核机制。虽然在实际使用中并不需要这些知识&#xff0c;但探索 PyTorch 内核能大大提升我…

java web 自定义标签_JavaWeb学习——自定义标签

自定义标签一、自定义标签概述使用标准JSP访问、操作JavaBean&#xff0c;是实现展现(HTML)与业务实现(Java代码)分离的第一步。然而&#xff0c;标准方法功能不够强大&#xff0c;以至于开发者无法仅仅使用它们开发应用&#xff0c;还要在JSP页面中使用Java代码。介于JavaBean…

739. Daily Temperatures - LeetCode

Question 739. Daily Temperatures Solution 题目大意&#xff1a;比今天温度还要高还需要几天 思路&#xff1a;笨方法实现&#xff0c;每次遍历未来几天&#xff0c;比今天温度高&#xff0c;就坐标减 Java实现&#xff1a; public int[] dailyTemperatures(int[] temperatur…

Android 抽屉效果Demo

2019独角兽企业重金招聘Python工程师标准>>> Android 抽屉效果Demo。 转载:http://www.adobex.com/android/source/details/00000110.htm 转载于:https://my.oschina.net/androidcode/blog/103821

DIV中文字不换行解决办法

解决办法如下&#xff1a;word-wrap &#xff1a; normal | break-word设置或检索当当前行超过指定容器的边界时是否断开转行。normal&#xff1a;控制连续文本换行。break-word&#xff1a;内容将在边界内换行。如果需要&#xff0c;词内换行&#xff08;word-break&#xff0…

python竞赛试题及答案_竞赛信息 | 蓝桥杯大赛Python组

蓝桥杯大赛 青少年创意编程Python组 竞赛规则及样题 — 竞赛规则 — 1 竞赛时长 Python编程组竞赛的选拔赛、省赛及国赛&#xff0c;竞赛时长均为120分钟&#xff0c;详细赛程安排另行通知。 2 竞赛形式 竞赛形式为个人赛&#xff0c;一人一机。 选手须自带笔记本计算机&#x…

Civil 3D 中使用COM API导入DEM数据创建曲面

Civil 3D提供的基于.net的API和基于COM的API&#xff0c;现在推荐大家使用.net API,但有时也需要使用COM API。 这个例子演示如何使用COM API来导入DEM数据生成Civil 3D曲面。 Civil 3D开发中使用COM API需要添加的引用比较啰嗦&#xff0c;建议使用向导创建项目简化操作&#…

牛客网第4场A

链接&#xff1a;https://www.nowcoder.com/acm/contest/142/A 来源&#xff1a;牛客网题目描述 A ternary string is a sequence of digits, where each digit is either 0, 1, or 2. Chiaki has a ternary string s which can self-reproduce. Every second, a digit 0 is i…

谈谈NiTE 2手部跟踪在彩色图像上的显示

主要内容&#xff1a; NiTE2手部跟踪流程代码演示总结一、NiTE2手部跟踪流程 我自己都感觉到天天在重复着相同的代码&#xff0c;但我觉得没什么不好的&#xff0c;对于新东西的学习只有在重复再重复的过程中&#xff0c;才能积累经验&#xff0c;较少犯“低级错误”的几率&…

java 应用是单机集群_【架构】Tomcat单机部署多应用Windows

Tomcat单机部署多应用-Windows1、添加新增的Tomcat相关环境变量CATALINA_BASE C:\tomcat1CATALINA_HOME C:\tomcat1TOMCAT_HOME C:\tomcat1CATALINA_2_BASE C:\tomcat2CATALINA_2_HOME C:\tomcat2TOMCAT_2_HOME C:\tomcat22、第一个tomcat不变3、打开第二个tomcat目录bin…

java long类型转string_JavaSE的学习——数据类型

数据类型分为基本数据类型和引用数据类型两大类在下面数据类型的介绍中只会介绍8种基本数据类型和引用数据类型中的类类型中的一个类String基本数据类型1. 计算机中的存储单位8bit 1byte 1024byte 1KB 1024KB 1M1024M 1GB1024GB 1T2. 整数型数据byte short int long1.long…

DWTagList

2019独角兽企业重金招聘Python工程师标准>>> DWTagList 根据给定的 NSArray 数组来创建标签列表&#xff0c;可自定义字体、颜色和其他属性。 转载:http://www.adobex.com/ios/source/details/00000820.htm 转载于:https://my.oschina.net/u/868244/blog/106245

爬虫(爬虫原理与数据抓取)

通用爬虫和聚焦爬虫 根据使用场景&#xff0c;网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统&#xff08;Baidu、Google、Yahoo等&#xff09;的重要组成部分。主要目的是将互联网上的网页下载到本地&#xff0c;形成一个互联网内容的…

SQL Server Insert 操作效率(堆表 VS 聚集索引表)

“SQL Server的Insert操作在堆表或者聚集索引表的时候&#xff0c;哪个效率更高&#xff1f;为什么高&#xff1f;” 之前有同事问过我这个问题&#xff0c;为了确保日志库的记录效率&#xff0c;于是我做了简单测试了&#xff0c;首先要先强调几点概念&#xff1a; 堆表&#…

electron 打包_Vue3+Electron整合方式

教程源码&#xff1a;nofacer/vue3-electron​github.com之前写过一篇文章Vue结合Electron构建跨平台应用&#xff08;TDD&#xff09;。当时的方法后来发现了一个问题&#xff0c;就是打包后的应用拿到其他机子上没法用&#xff0c;原因在于index.html的地址是个绝对路径&…

Linux按照时间顺序列出文件

按照递增时间顺序列出所有文件 ls -ltr -l表示列出长串数据&#xff0c;-t表示按照时间顺序&#xff0c;-r表示将排序的结果反向输出 按照时间递减的顺序列出所有文件 ls -lt 转载于:https://www.cnblogs.com/yongjieShi/p/9395932.html

RestKit

2019独角兽企业重金招聘Python工程师标准>>> Restkit 是一个开源的 objective-c 框架&#xff0c;允许在 iOS 和 Mac OS X 的 Objective-C 中与 RESTful Web 服务进行交互&#xff0c;包含简单的 HTTP request/response API &#xff0c;带有强大的对象映射系统用于…

全国计算机等级考试题库二级C操作题100套(第41套)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

2012年终总结 二

2019独角兽企业重金招聘Python工程师标准>>> 接上文。。。 经过一些搜索和了解之后&#xff0c;最后选定了我现在这个公司。现在&#xff0c;至少我没有感觉到我选错。 刚近公司&#xff0c;进行了新人的入职培训1天&#xff0c;这个主要是了解公司状况。而后&…

python语言包括哪些实现_Python语言基础考察点:python语言基础常见考题(一)

一、python是静态还是动态类型&#xff1f;是强类型还是弱类型&#xff1f; 1、动态强类型语言(不少人误以为是弱类型) 不要傻傻分不清 2、动态还是静态指的是编译期还是运行期确定类型 3、强类型指的是不会发生隐式类型转换 若类型语言强类型语言4、python作为后端语言优缺点 …