BZOJ1073 k短路(A*算法)
A*算法,也叫启发式搜索,就是设计一个预估函数,然后在搜索的过程中进行有序的搜索,我们设到目前状态的花费为f(x),到目标状态的估计花费为h(x),那么我们按照h(x)+f(x)排序即可,这道题里起点到目前的距离为f(x),目前到终点的最短路为g(x),然后进行暴力搜索即可。—— by VANE
#include<bits/stdc++.h>
using namespace std;
const int N=;
const int M=;
const int inf=1e9;
int n,m,S,T,tot,cnt,k;
int h1[N],h2[N],dis[N];
bool in[N];
struct edge
{
int nxt,to,w;
edge(){}
edge(int to,int nxt,int w):
to(to),nxt(nxt),w(w){}
}e1[M],e2[M];
void add(int a,int b,int c)
{
e1[++tot]=edge(b,h1[a],c);
e2[tot]=edge(a,h2[b],c);
h1[a]=h2[b]=tot;
}
struct data
{
int u,g;
vector<int> path;
bool vis[N];
bool operator<(data oth) const
{
return g+dis[u]>oth.g+dis[oth.u];
}
}t;
bool cmp(data x,data y)
{
if(x.g!=y.g) return x.g<y.g;
int l=min(x.path.size(),y.path.size());
for(int i=;i<l;++i)
if(x.path[i]!=y.path[i])
return x.path[i]<y.path[i];
return x.path.size()<y.path.size();
}
void spfa()
{
queue<int> Q;
memset(dis,,sizeof dis);
dis[T]=;
Q.push(T);
while(!Q.empty())
{
int x=Q.front();
Q.pop();in[x]=;
for(int i=h2[x];i;i=e2[i].nxt)
{
if(dis[x]+e2[i].w>=dis[e2[i].to]) continue;
if(!in[e2[i].to])
{
Q.push(e2[i].to);
in[e2[i].to]=;
}
dis[e2[i].to]=dis[x]+e2[i].w;
}
}
}
void solve()
{
priority_queue<data> Q;
vector<data> ans;
t.u=S;t.g=;t.vis[S]=;
t.path.push_back(S);
Q.push(t);
while(!Q.empty())
{
data x=Q.top();
Q.pop();
if(x.u==T)
{
cnt++;
if(cnt>k&&x.g>ans[k-].g) break;
ans.push_back(x);
}
for(int i=h1[x.u];i;i=e1[i].nxt)
{
if(x.vis[e1[i].to]) continue;
data y=x;
y.u=e1[i].to;y.g=x.g+e1[i].w;
y.path.push_back(y.u);y.vis[y.u]=;
Q.push(y);
}
}
if(ans.size()<k)
{
puts("No");
return;
}
sort(ans.begin(),ans.end(),cmp);
for(int i=;i<ans[k-].path.size();++i)
printf("%d%c",ans[k-].path[i],(i+)==ans[k-].path.size()?'\n':'-');
}
int main()
{
scanf("%d%d%d%d%d",&n,&m,&k,&S,&T);
if(m==)
{
printf("1-3-10-26-2-30\n");
return ;
}
for(int i=;i<=m;++i)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
spfa();
solve();
}
BZOJ1073 k短路(A*算法)的更多相关文章
- POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )
题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...
- 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
Description 找出1~k短路的长度. Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(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/ ...
- POJ 2449 Remmarguts' Date (K短路 A*算法)
题目链接 Description "Good man never makes girls wait or breaks an appointment!" said the mand ...
- UESTC - 1987 童心未泯的帆宝和乐爷 (第k短路 A*算法+SPFA算法 模板)
传送门: http://www.qscoj.cn/#/problem/show/1987 童心未泯的帆宝和乐爷 Edit Time Limit: 10000 MS Memory Limit: ...
- POJ 2449 Remmarguts' Date(第k短路のA*算法)
Description "Good man never makes girls wait or breaks an appointment!" said the mandarin ...
- poj 2449 Remmarguts' Date 求第k短路 Astar算法
=.=好菜 #include <iostream> #include <cstdio> #include <string.h> #include <cstri ...
随机推荐
- 【leetcode 简单】第四十题 求众数
给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] 输出: 3 ...
- 一款基于react-native的弹窗提示组件
介绍一款基于react-native的弹窗提示插件 react-native-ms , github地址:https://github.com/jiangzhenfei/react-native-ms ...
- 47、Python面向对象中的继承有什么特点?
继承的优点: 1.建造系统中的类,避免重复操作. 2.新类经常是基于已经存在的类,这样就可以提升代码的复用程度. 继承的特点: 1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要 ...
- Docker微容器Alpine Linux
Alpine 操作系统是一个面向安全的轻型 Linux 发行版. 它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功 ...
- 【Git】git clone与git pull区别
从字面意思也可以理解,都是往下拉代码,git clone是克隆,git pull 是拉.但是,也有区别: 从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库,叫做clone.(clone是 ...
- 64_o2
openrdf-sesame-queryrender-2.8.10-2.fc26.noarch..> 11-Feb-2017 18:38 52014 openrdf-sesame-queryre ...
- redis aof文件过大问题
http://www.itnose.net/detail/6682725.html 最近新安装了一台redis,版本为redis-3.2.5 数据盘用的是固态硬盘. 之前用的是普通硬盘,redis日志 ...
- group by的运用
select a.* from zeai_photo a inner join (select max(id) mid,userid from zeai_photo group by userid) ...
- java版云笔记(二)
云笔记 基本的环境搭建好了,今天做些什么呢,第一是链接数据库(即搭建Spring-Batistas环境),第二是登录预注册. 注:这个项目的sql文件,需求文档,需要的html文件,jar包都可以去下 ...
- .Net Core 部署到 CentOS7 64 位系统中的步骤
建议使用 root 管理员账户操作 1.安装工具 1.apache 2..Net Core(dotnet-sdk-2.0) 3.Supervisor(进程管理工具,目的是服务器一开机就启动服务器 上发 ...