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 ...
随机推荐
- Hdu 2376
题目链接 题意:给出一颗含有n个结点的树,树上每条边都有一个长度,求树上所有路径的平均长度. 考虑树上每条边对所有路径长度和的贡献,对于每条偶 就是边的两个短点u和v,只需要记录以u为根的子树的结点的 ...
- Thinkphp 加载更多
要实现的效果是这样的: 每次点击显示更多按钮,都会往下显示2条数据,直到后面没有数据了.. 数据表: articleList模板文件 <include file="./Applicat ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override). 1 2{<HeadFirst设计模式>之模板方法模式 } 3{ 编译工具: Del ...
- tinyproxy 反向代理无法上网原因
今天参照网上教程在服务器安装并配置了tinyproxy反向代理,此次安装反向代理的目的主要是通过内网连接上服务器,再使用服务器作为中转站进行上网.安装并启动的主要步骤如下 下载并安装tinypro ...
- 机器学习实战之Apriori
机器学习实战之Apriori 1. 关联分析 1.1 定义 关联分析是一种在大规模数据上寻找物品间隐含关系的一种任务.这种关系有2种形式:频繁项集和关联规则. (1) 频繁项集(freq ...
- JSP四大域对象与九大内置对象
什么是内置对象? 在jsp开发中会频繁使用到一些对象,如 ServletContext.HttpSession.PageContext 等: 如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手 ...
- ajax原理及使用
1.关于同步和异步 异步传输是面向字符的传输,它的单位是字符:而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的. 具体来说,异步传输是将比特分成小组来进行传送 ...
- 设置eclipse自动补全
点击" Window>Preferences"; 选择"Java>Editor>Content Assist",在右侧的"Auto- ...
- pycharm解决无法调用同文件夹下的文件
一.将所有的文件放在project这个根目录下面 二.添加一个空的__init__.py 文件 三.选中project根目录,点击右键选择make_directory as-->sources ...
- java 字符串拼接
package com.fh.controller.pacm.checkbill; import com.google.common.base.Joiner; /** * 字符串拼接 * * @aut ...