k短路算法
k短路算法
求解k短路用到了A* 算法,A* ( A star )算法,又称启发式搜索算法,与之相对的,dfs与bfs都成为盲目型搜索;即为带有估价函数的优先队列BFS称为A*算法。
该算法的核心思想为设计一个估价函数,估价函数需要满足下面几个准则:
1:设当前状态state到目标状态所需的估计值为\(f(state)\)。
2:在未来的搜索中,实际求出的从当前状态state到目标状态的最小代价为\(g(state)\)。
3:对于任意的\(state\),应该有\(f(state)<=g(state)\)。
之后每次取出“当前代价+未来估价最小的状态,最终更新到目标状态上,就能得到最优解。
A*算法的应用非常广,被广泛应用于最优路径求解和一些策略设计问题中。
首先跑一下Dijkstra或者SPFA反向求一下终点到各个点的最短路,然后A*求出k短路,上代码:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
int head[maxn],head1[maxn],tot,tot1;
int n,m,s,t,k,dis[maxn];
struct Edge{
int nex,to,val;
}edge[maxn],edge1[maxn];
struct node{
int to,f,g; //估价函数和实际代价
friend bool operator <(const node& a,const node& b){
if(a.f==b.f) return a.g>b.g;
return a.f>b.f;
}
}now,temp;
bool vis[maxn];
void add(int from,int to,int val)
{
edge[++tot].to=to;
edge[tot].val=val;
edge[tot].nex=head[from];
head[from]=tot;
}
void add1(int from,int to,int val)
{
edge1[++tot1].to=to;
edge1[tot1].val=val;
edge1[tot1].nex=head1[from];
head1[from]=tot1;
}
queue<int> q;
bool spfa(int s)
{
for(int i=1;i<=n;++i){
dis[i]=inf;
vis[i]=false;
}
vis[s]=1;
dis[s]=0;
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u] = 0;
for(int i=head1[u];i!=-1;i=edge1[i].nex){
int v=edge1[i].to;
if(dis[v]>dis[u]+edge[i].val){
dis[v]=dis[u]+edge[i].val;
if(vis[v]) continue;
vis[v] = 1;
q.push(v);
}
}
}
return true;
}
priority_queue<node> que;
int A_star()
{
int cnt=0;
while(!que.empty()) que.pop();
if(!spfa(t)||dis[s]==inf) return -1;
if(s==t) ++k; //起点跟终点相同,不能算dis=0这一条
now.to=s;
now.g=0;
now.f=now.g+dis[now.to];
que.push(now);
while(!que.empty()){
now = que.top();
que.pop();
if(now.to==t) cnt++;
if(cnt==k) return now.g;
for(int i=head[now.to];i!=-1;i=edge[i].nex){
temp.to=edge[i].to;
temp.g=now.g+edge[i].val;
temp.f=temp.g+dis[temp.to];
que.push(temp);
}
}
return -1;
}
int main()
{
while(scanf("%d %d",&n,&m)==2)
{
for(int i=1;i<=n;++i){
head[i]=head1[i]=-1;
}
tot=tot1=0;
for(int i=1;i<=m;++i){
int a,b,val;
scanf("%d %d %d",&a,&b,&val);
add(a,b,val);
add1(b,a,val);
}
scanf("%d %d %d",&s,&t,&k);
printf("%d\n",A_star());
}
}
k短路算法的更多相关文章
- 浅谈k短路算法
An Old but Classic Problem 给定一个$n$个点,$m$条边的带正权有向图.给定$s$和$t$,询问$s$到$t$的所有权和为正路径中,第$k$短的长度. Notice 定义两 ...
- POJ 2449 Remmarguts' Date (K短路 A*算法)
题目链接 Description "Good man never makes girls wait or breaks an appointment!" said the mand ...
- A*算法的认识与求第K短路模板
现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...
- POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )
题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...
- POJ 2449Remmarguts' Date 第K短路
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 29625 Accepted: 8034 ...
- POJ--2449--Remmarguts' Date【dijkstra_heap+A*】第K短路
链接:http://poj.org/problem?id=2449 题意:告诉你有n个顶点,m条边.并把这些边的信息告诉你:起点.终点.权值.再告诉你s.t.k.需求出s到t的第k短路,没有则输出-1 ...
- 沈阳网络赛D-Made In Heaven【k短路】【模板】
One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. However, Pucci ...
- poj2449(k短路&A_star模板)
题目链接:http://poj.org/problem?id=2449 题意:给出一个有向图,求s到t的第k短路: 思路:k短路模板题,可以用A_star模板过: 单源点最短路径+高级搜索A*;A*算 ...
- 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
Description 找出1~k短路的长度. Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...
随机推荐
- python操作oracle完整教程
1. 连接对象 操作数据库之前,首先要建立数据库连接.有下面几个方法进行连接. >>>import cx_Oracle>>>db = cx_Oracle.co ...
- 算法刷题--回溯算法与N皇后
所谓回溯算法,在笔者看来就是一种直接地思想----假设需要很多步操作才能求得最终的解,每一步操作又有很多种选择,那么我们就直接选择其中一种并依次深入下去.直到求得最终的结果,或是遇到明细的错误,回溯到 ...
- Nginx做代理
0 查看日志 tail -f /var/log/nginx/access.log 1 Nginx代理配置语法 1.Nginx代理配置语法 Syntax: proxy_pass URL; Default ...
- Spring-boot JDBC with multiple DataSources sample
Spring-Boot's auto-configurer seems good for simple applications. For example it automatically creat ...
- 避坑之Hadoop安装伪分布式(Hadoop3.2.0/Ubuntu14.04 64位)
一.安装JDK环境(这个可以网上随意搜一篇教程了照着弄,这里不赘述) 安装成功之后 输入 输入:java -version 显示如下说明jdk安装成功(我这里是安装JDK8) 二.安装Hadoop3. ...
- ES6-形参默认值
在定义一个函数的时候,我们定义了几个函数的参数,但是在调用的时候我们可能并没有传入足够的参数,那么未被满足的参数的值就是undefined,在ES6中如果有这种情况我们可以给形参一个默认值,如果该形参 ...
- 【译】高级T-SQL进阶系列 (三)【中篇】:理解公共表表达式(CTEs)
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 一个简单的CTE例子 如前所述,CTE‘s提供给你了一个方法来更容易的书写复杂的代码以提高其可读性.假设你有列表 ...
- Sqoop的安装及常用命令
本次安装主要是为了离线分析数据清洗完成后的操作:网站日志流量分析系统之数据清洗处理(离线分析) 一.概述 1. sqoop是Apache 提供的工具,用于hdfs和关系型数据库之间数据的导入和导入 2 ...
- python基础教程系列1-基础语法
最近在学习python,主要通过廖雪峰的python教程入门,看看自己能够花多少时间最快入门.通过写博客梳理自己的知识点,强化自己的记忆.总的学习思路是,快速学习一遍教程,然后做一些算法题目实践,再然 ...
- java.io.NotSerializableException 没有序列化异常
在实现MyBatis的二级缓存时,遇到此异常,其原因是实体类未实现Serializable接口. 异常: org.apache.ibatis.cache.CacheException: Error s ...