1598: [Usaco2008 Mar]牛跑步

题意:k短路


貌似A*的题目除了x数码就是k短路



$$
f(x) = g(x) + h(x)
$$
$g(x)$为到达当前状态实际代价,$h(x)$为当前状态到目标状态的估计代价,需满足$h(x) \le 到目标状态的实际最小代价$

k短路问题中,\(g(x)\)为当前到x的路径长度,\(h(x)\)为x到终点的最短路

根据dijkstra算法,节点i第k次出优先队列时就是s到i的k短路


但是这个算法可以被n元环卡成\(O(nk)\),还有一种做法还要写可持久化堆好麻烦不学了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define fir first
#define sec second
const int N = 1005, M = 1e4+5, INF = 1e9+5;
inline int read(){
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
} int n, m, k, u, v, w, s, t;
namespace I {
struct edge{int v, ne, w;} e[M];
int cnt, h[N];
inline void ins(int u, int v, int w) {
e[++cnt] = (edge){v, h[u], w}; h[u] = cnt;
}
priority_queue<pii, vector<pii>, greater<pii> > q;
int vis[N];
void dij(int s, int t, int *d) {
for(int i=1; i<=n; i++) d[i] = INF, vis[i] = 0;
d[s] = 0; q.push(make_pair(0, s));
while(!q.empty()) {
int u = q.top().sec; q.pop();
if(vis[u]) continue; vis[u] = 1;
for(int i=h[u];i;i=e[i].ne) {
int v = e[i].v;
if(d[v] > d[u] + e[i].w)
d[v] = d[u] + e[i].w, q.push(make_pair(d[v], v));
}
}
}
} int d_t[N]; struct edge{int v, ne, w;} e[M];
int cnt, h[N];
inline void ins(int u, int v, int w) {
e[++cnt] = (edge){v, h[u], w}; h[u] = cnt;
}
priority_queue<pii, vector<pii>, greater<pii> > q;
int vis[N], ans[105];
void a_star(int s, int t) {
I::dij(t, s, d_t);
for(int i=1; i<=n; i++) vis[i] = 0;
q.push(make_pair(d_t[s], s));
while(!q.empty()) {
int u = q.top().sec, d = q.top().fir; q.pop();
vis[u]++;
if(u == t) {
ans[vis[t]] = d;
if(vis[t] == k) return;
}
if(vis[u] <= k) for(int i=h[u];i;i=e[i].ne) {
int v = e[i].v;
q.push(make_pair(d - d_t[u] + d_t[v] + e[i].w, v));
}
}
} int main() {
freopen("in", "r", stdin);
n=read(); m=read(); k=read(); s=n; t=1;
for(int i=1; i<=m; i++) u=read(), v=read(), w=read(), I::ins(v, u, w), ins(u, v, w);
memset(ans, -1, sizeof(ans));
a_star(s, t);
for(int i=1; i<=k; i++) printf("%d\n", ans[i]);
}

bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]的更多相关文章

  1. Bzoj 1598: [Usaco2008 Mar]牛跑步 dijkstra,堆,K短路,A*

    1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 427  Solved: 246[Submit][St ...

  2. bzoj 1598: [Usaco2008 Mar]牛跑步 -- 第k短路,A*

    1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec  Memory Limit: 162 MB Description BESSIE准备用从牛棚跑到池塘的方法来锻炼 ...

  3. bzoj 1598: [Usaco2008 Mar]牛跑步【A*K短路】

    A*K短路模板,详见https://blog.csdn.net/z_mendez/article/details/47057461 算法流程: 把有向图全建成反向边,跑一遍所有点到t的最短路记为dis ...

  4. bzoj:1598: [Usaco2008 Mar]牛跑步

    Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M ...

  5. 【BZOJ】1598: [Usaco2008 Mar]牛跑步

    [题意]给定有向图,边严格从大编号指向小编号,求前k短路.n<=1000,m<=10000,k<=100. [算法]归并+拓扑排序||A*求第k短路 [题解]因为此题自带拓扑序的特殊 ...

  6. BZOJ_1598_[Usaco2008 Mar]牛跑步_A*

    BZOJ_1598_[Usaco2008 Mar]牛跑步_A* Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. B ...

  7. K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院

    A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...

  8. BZOJ1598: [Usaco2008 Mar]牛跑步

    传送门 K短路,普遍的算法是采用AStar求解,先建立反向边跑一遍dij,或者spfa什么的.跑出反向边的距离就可以看为估价函数中的$h()$.设$dist$为当前已经走过的距离,那么$f(node) ...

  9. 【bzoj1598】【 [Usaco2008 Mar]牛跑步】启发式搜索思路+spfa

    (上不了p站我要死了,侵权度娘背锅) 最近复习搜索,先从启发式搜索来吧. 感觉启发式搜索这玩意挺玄学的,先从其思想入手,做一道经典的K短路. Description BESSIE准备用从牛棚跑到池塘的 ...

随机推荐

  1. c# tolist() 浅析

    在介绍tolist()的时候我先个大家介绍一下linq的延迟加载: var products = new List<Product> { , Category = "Electr ...

  2. vim 的各种用法,很实用哦,都是本人是在工作中学习和总结的

    (一)初级个性化配置你的vim 1.vim是什么? vim是Vi IMproved,是编辑器Vi的一个加强版,一个极其强大并符合IT工程师(程序员.运维)习惯的编辑器.如果你是一名职业的SE,那么一定 ...

  3. IOS学习笔记27—使用GDataXML解析XML文档

    http://blog.csdn.net/ryantang03/article/details/7868246

  4. mybatis_SQL缓存(5)

    <settings> <!-- 这个配置使全局的映射器启用或禁用缓存 --> <setting name="cacheEnabled" value=& ...

  5. 【原创】区分png图片格式和apng图片格式的解决办法

    最近公司有个项目,要抓取客户微信公众号的文章,以及文章内容中的图片,并且在图片加上客户自己的水印.我们使用阿里云OSS存储图片和加水印,发现真心好用,提升了我们的开发效率,阿里云现在是越来越强大了.. ...

  6. Spring MVC 用post方式提交表单到Controller乱码问题,而get方式提交没有乱码问题

    在web.xml中添加一个filter,即可解决post提交到Spring MVC乱码问题 <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> ...

  7. CentOS 6.3 64位下MySQL5.1.54源码安装配置详解

    安装环境:CentOS 6.3 64位 一:先安装依赖包(不然配置的时候会报错的!) yum -y install ncurses* libtermcap* 新建mysql用户 [root@clien ...

  8. Git知识总览(四) git分支管理之rebase 以及 cherry-pick相关操作

    上篇博客聊了<Git知识总览(三) 分支的创建.删除.切换.合并以及冲突解决>,本篇博客我们主要来看一下 rebase 变基相关的操作.rebase 操作和 merge 操作最终都可以达到 ...

  9. java基础-静态,非静态(构造)代码块,类加载

    static block and non-static block(constructor block) [toc] 想来想去,先来一题比较好 public class Foo { public st ...

  10. maven的聚合和继承

    Maven的聚合特性能够把项目的各个模块聚合在一起构建: 而Maven的继承特性则能帮组抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. 聚合:新建一个项目demo ...