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短路算法的更多相关文章

  1. 浅谈k短路算法

    An Old but Classic Problem 给定一个$n$个点,$m$条边的带正权有向图.给定$s$和$t$,询问$s$到$t$的所有权和为正路径中,第$k$短的长度. Notice 定义两 ...

  2. POJ 2449 Remmarguts' Date (K短路 A*算法)

    题目链接 Description "Good man never makes girls wait or breaks an appointment!" said the mand ...

  3. A*算法的认识与求第K短路模板

    现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...

  4. POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )

    题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...

  5. POJ 2449Remmarguts' Date 第K短路

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 29625   Accepted: 8034 ...

  6. POJ--2449--Remmarguts&#39; Date【dijkstra_heap+A*】第K短路

    链接:http://poj.org/problem?id=2449 题意:告诉你有n个顶点,m条边.并把这些边的信息告诉你:起点.终点.权值.再告诉你s.t.k.需求出s到t的第k短路,没有则输出-1 ...

  7. 沈阳网络赛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 ...

  8. poj2449(k短路&A_star模板)

    题目链接:http://poj.org/problem?id=2449 题意:给出一个有向图,求s到t的第k短路: 思路:k短路模板题,可以用A_star模板过: 单源点最短路径+高级搜索A*;A*算 ...

  9. 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院

    Description 找出1~k短路的长度.   Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...

随机推荐

  1. 手码两万余字,SpringMVC 包教包会

    1. SpringMVC 简介 1.1 Spring Web MVC是什么 Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架, ...

  2. opencv:图像的算术操作

    前提:输入图像的大小和类型必须一致 越界处理: 大于255,则会减去255 小于0,则等于0 基本计算,加减乘除 #include <opencv2/opencv.hpp> #includ ...

  3. toSum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  4. JAVA基础学习(5)之数组

    5数组 5.1数组 5.1.1初识数组 // 输出大于平均数的所有数 Scanner in = new Scanner(System.in); int n; int[] a = new int[100 ...

  5. python的爬虫小入门

    爬虫的相关操作 1.爬文本内容 # coding=gbk import requests ##声明相关库 import re response=requests.get('http://duanziw ...

  6. eclipse中使用maven update project功能后,默认又回到了jre 1.5的解决方案

    在maven项目中的pom.xml中添加以下节点,进行jre版本的配置,配置完后再进行项目更新后,并不会自动切换到jre1.5 添加在pom的url标签后面 <build>         ...

  7. buuctf——facebook1

    分为注册和登陆两个页面 据大佬wp登陆页面又盲注,但我没测试 直接注册后登陆 注册后发现,会显示输入的url 根据目录扫描,发现robots.txt和flag.php robots.txt有源码备份 ...

  8. 吴裕雄 python 神经网络——TensorFlow 花瓣分类与迁移学习(3)

    import glob import os.path import numpy as np import tensorflow as tf from tensorflow.python.platfor ...

  9. JAVA接口测试类

    package etcom.servlet; import java.io.BufferedReader; import java.io.InputStreamReader; import java. ...

  10. JIRA 安装与破解 Mac版

    1.安装 JDK 2.安装 MySQL 下载地址:https://dev.mysql.com/downloads/ 选择对应版本下载安装.我选择的是 mysql-8.0.11-macos10.13-x ...