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
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代码:

 #include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int AX = 1e5+;
const int MAXN = 1e3+;
int n,m,k;
int s,t;
int tot;
int retot;
struct edge{
int to,w;
int next1;
}G[AX],RG[AX]; struct Node{
int v;
int f,h,g;
bool operator < (const Node &a) const{ return f==a.f? g>a.g : f>a.f; }
}; int dis[MAXN];
int head[MAXN];
int rehead[AX];
int vis[MAXN]; void add_edge(int u,int v,int c)
{
G[tot].to=v;
G[tot].w=c;
G[tot].next1=head[u];
head[u]=tot++; RG[retot].to=u;
RG[retot].w=c;
RG[retot].next1=rehead[v];
rehead[v]=retot++;
}
void SPFA()
{
for(int i=;i<=n;i++) dis[i]=INF;
dis[t]=;
queue<int> Q;
Q.push(t);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=rehead[u];i!=-;i=RG[i].next1)
{
int v=RG[i].to ;
int w=RG[i].w ;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
Q.push(v);
}
}
}
} int Astar(Node a)
{
memset(vis,,sizeof(vis));
if(dis[s]==INF) return -;//如果没有与S相连的点
if(s==t) k++;
priority_queue<Node> Q;
Q.push(a);
while(!Q.empty())
{
Node tmp=Q.top();
Q.pop();
int v=tmp.v;
vis[v]++;
if(vis[t]==k) return tmp.g;
for(int i=head[v];i!=-;i=G[i].next1)
{
Node p;
p.v=G[i].to;
p.h=dis[G[i].to];
p.g=tmp.g+G[i].w;
p.f=p.g+p.h;
Q.push(p);
}
}
return -;
} int main()
{
tot=;
retot=;
memset(head,-,sizeof head);
memset(rehead,-,sizeof rehead);
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&t);
int x,y,w;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&w);
add_edge(x,y,w);
}
SPFA();
Node a;
a.v=s;
a.g=;
a.h=dis[s];
a.f=a.g+a.h;
int g=Astar(a);
printf("%d\n",g);
return ;
}

后面我还会更新出 关于启发式搜索的讲解,以及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. vue使用一些外部插件及样式的配置

    一.配置全局css及js样式 1.首先将事先写好的css文件及js文件放在src文件目录下的assets文件下 2.在main.js文件输上图右边两个红色框的代码 二.配置全局jQuery及boots ...

  2. pat 1058 A+B in Hogwarts(20 分)

    1058 A+B in Hogwarts(20 分) If you are a fan of Harry Potter, you would know the world of magic has i ...

  3. nyoj 264-国王的魔镜 (string[-1:-int(str_len/2+1):-1])

    264-国王的魔镜 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:25 难度:1 题目描述: 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜 ...

  4. Android、IOS的Fiddler证书安装教程

    通过手机连接fiddler实现代理访问,其中必须得安装证书才能生效,那么针对不同的手机连接方式也不一样,分为两类:Android.iOS: Android-Fiddler证书安装: 直接在任意浏览器中 ...

  5. vue—自定义指令

    今日分享—自定义指令 需要学习的点: modifiers属性的具体实例就是v-on:click.stop=”handClick” 一样,为指令添加一个修饰符. 全局指令:新建一个newDir.js i ...

  6. 新闻实时分析系统-Hadoop2.X分布式集群部署

    (一)hadoop2.x版本下载及安装 Hadoop 版本选择目前主要基于三个厂商(国外)如下所示: 1.基于Apache厂商的最原始的hadoop版本, 所有发行版均基于这个版本进行改进. 2.基于 ...

  7. Selenium+Java(三)Selenium元素定位

    前言 使用Selenium做元素定位的时候,需要用到HTML的知识,所以最好是能懂得HTML的基本知识. 一.页面元素的查看(以百度为例) 打开IE浏览器,点击F12进入开发者模式,点击图中红圈圈中的 ...

  8. 01_Numpy基本使用

    1.Numpy读取txt/csv文件 读取数据 import numpy as np # numpy打开本地txt文件 world_alcohol = np.genfromtxt("D:\\ ...

  9. nginx的使用,以及反向代理,负载均衡,从安装到使用,全部步骤。

    先总结nginx实现负载均衡的原理,在这之前先的知道反向代理,因为nginx的负载均衡是在反向代理的基础上实现的: 1.反向代理:通过在nginx的配置文件 (vim /opt/nginx196/co ...

  10. 【Android - 控件】之MD - Snackbar的使用

    Snackbar 是 Android 5.0 新特性——Material Design 中的一个控件,用来代替 Toast ,Snackbar与Toast的主要区别是:Snackbar可以滑动退出,也 ...