poj2449第K短路问题(A*算法)
启发函数:f(x)=g(x)+h(x);
g(x)表示初始点到x状态的代价,h(x)表示从x的状态到目标状态的代价的估计值(并不是真实的),实际最小代价<=h(x);
起点s,终点t,x.v=s,x.len=0;然后优先队列中f(x)值最小值出队列,再根据出队列的x.v状态发展下一层。如果出队列时第一次遇到x.v==t,
就找到了s到t的最短路。...如果第k次,那就是第k短。为了加速计算,h(p)需要在A*搜索之前进行预处理,只要将原图的所有边反向,
再从终点t做一次单源点最短路径就能得到每个点的h(p)了;
其实到现在可以发现,如果g(x)为0,那么求出来的就是最短路系列,如果h(x)为0,求出来的就是BFS最少次数。
#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 99999999
using namespace std;
const int maxn = ;
struct Enode
{
int to;
int val;
int next;
}edge1[],edge2[];
struct node
{
int to;
int g,f;//g别的点到此状态的代价 f启发函数
friend bool operator<(node a,node b){
if(a.f!=b.f)
return a.f>b.f;
return a.g>a.g;
}
};
int n,dis[maxn],pre1[maxn],pre2[maxn],index1,index2;
void init()
{
index1=index2=;
memset(pre1,-,sizeof(pre1));
memset(pre2,-,sizeof(pre2));
}
void add1(int x,int y,int z)
{
edge1[index1].to=y;
edge1[index1].val=z;
edge1[index1].next=pre1[x];
pre1[x]=index1++;
}
void add2(int x,int y,int z)
{
edge2[index2].to=y;
edge2[index2].val=z;
edge2[index2].next=pre2[x];
pre2[x]=index2++;
}
void spfa(int s)
{
queue<int>q;
int vis[maxn],i,j;
for(i=;i<=n;i++)
{
vis[i]=;
dis[i]=INF;
}
dis[s]=;
vis[s]=;
q.push(s);
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]--;
if(vis[t]>n)
break;
for(i=pre2[t];i!=-;i=edge2[i].next)
{
if(dis[edge2[i].to]>dis[t]+edge2[i].val)
{
dis[edge2[i].to]=dis[t]+edge2[i].val;
q.push(edge2[i].to);
}
}
}
}
int A_star(int s,int t,int k)
{
node temp;
priority_queue<node>q;
int cnt=;
if(s==t) k++;
if(dis[s]==INF)
return -;
temp.to=s;
temp.g=;
temp.f=temp.g+dis[temp.to];
q.push(temp);
while(!q.empty())
{
temp=q.top();
q.pop();
if(temp.to==t)
{
cnt++;
}
if(cnt==k)
{
return temp.g;
}
for(int i=pre1[temp.to];i!=-;i=edge1[i].next)
{
node tt;
tt.to=edge1[i].to;
tt.g=temp.g+edge1[i].val;
tt.f=tt.g+dis[tt.to];
q.push(tt);
}
}
return -;
}
int main()
{
int i,j,m;
while(~scanf("%d%d",&n,&m))
{
init();
for(i=;i<m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add1(x,y,z);//原图
add2(y,x,z);//反向图
}
int s,t,k;
scanf("%d%d%d",&s,&t,&k);
spfa(t);
int ans=A_star(s,t,k);
printf("%d\n",ans);
}
}
poj2449第K短路问题(A*算法)的更多相关文章
- ACM-ICPC 2018 沈阳赛区网络预赛 D Made In Heaven(第k短路,A*算法)
https://nanti.jisuanke.com/t/31445 题意 能否在t时间内把第k短路走完. 分析 A*算法板子. #include <iostream> #include ...
- poj2449 第k短路
题目链接 学习博客:https://blog.csdn.net/Z_Mendez/article/details/47057461 k短路没有我想象的那么难,还是很容易理解的 求s点到t点的第k短路径 ...
- BZOJ1073 k短路(A*算法)
A*算法,也叫启发式搜索,就是设计一个预估函数,然后在搜索的过程中进行有序的搜索,我们设到目前状态的花费为f(x),到目标状态的估计花费为h(x),那么我们按照h(x)+f(x)排序即可,这道题里起点 ...
- POJ2449 (k短路)
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> # ...
- A*模板(求K短路)(POJ2449)
A*是bfs的优化,IDA*是dfs的优化 A*算法: 为启发式算法中很重要的一种,被广泛应用在最优路径求解和一些策略设计的问题中.而A*算法最为核心的部分,就在于它的一个估值函数的设计上: f(n) ...
- K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院
A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...
- poj 2449 k短路+A*算法
http://poj.org/problem?id=2449 K短路的定义: 1.如果起点终点相同,那么0并不是最短路,而是要出去一圈回来之后才是最短路,那么第K短路也是一样. 2.每个顶点和每条边都 ...
- poj 2449 Remmarguts' Date(K短路,A*算法)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...
- POJ2449:K短路
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 26355 Accepted: 7170 ...
随机推荐
- kill 3000
杀3000端口,是作为一个web未开发人员经常遇到的事情 所以我今天就分享一下我的杀3000端口秘诀 lsof -i: 先要找到端口 node zcool 20u IPv6 0xdddbb4f6f12 ...
- request.getSession().getServletContext().getRealPath("upload/" ); 获取不到 tomcat 服务器目录
上传一个文件,找不到该文件的位置 设置上传的文件是在项目中的话 可以通过查找项目的路径锁定上传的文件路径 解决步骤: 可以通过jsp页面 打印获取项目的物理路径 控制台即可输出项目路径 这只是找了了上 ...
- Vuejs实战项目步骤一
1.使用vue初始化项目 vue create msm-demo #创建项目 npm run serve #部署 2.更改public文件夹下面的index文件,只留下 <div id=&quo ...
- Trees in a Wood UVA - 10214 欧拉函数模板
太坑惹,,,没用longlong各种WA #include <iostream> #include <string.h> #include <cstdio> #in ...
- Luogu P1462 通往奥格瑞玛的道路(最短路+二分)
P1462 通往奥格瑞玛的道路 题面 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己 ...
- JAVA面试常见问题之锁机制篇
1.说说线程安全问题,什么是线程安全,如何保证线程安全 线程安全:就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不 ...
- 使用innerHTML属性向head中插入字符时报“无法设置 innerHTML 属性。 该操作的目标元件无效”的错误
向head中动态插入script文件,代码如下: var sc = document.createElement("script"); sc.src = "//www.c ...
- js中的定义变量之①用不用var
var 是js定义变量的意思. 由于js中的变量是弱类型的,因此js中的所有变量包括number(数字型).string(字符串类型).boolean(布尔类型,true和false)等均通过var关 ...
- Python中3种内建数据结构:列表、元组和字典
Python中3种内建数据结构:列表.元组和字典 Python中有3种内建的数据结构:列表.元组和字典.参考简明Python教程 1. 列表 list是处理一组有序项目的数据结构,即你可以在一个列表中 ...
- Python缩进和选择
Python缩进和选择 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这 ...