bzoj 1598: [Usaco2008 Mar]牛跑步 [k短路 A*] [学习笔记]
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*] [学习笔记]的更多相关文章
- Bzoj 1598: [Usaco2008 Mar]牛跑步 dijkstra,堆,K短路,A*
1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 427 Solved: 246[Submit][St ...
- bzoj 1598: [Usaco2008 Mar]牛跑步 -- 第k短路,A*
1598: [Usaco2008 Mar]牛跑步 Time Limit: 10 Sec Memory Limit: 162 MB Description BESSIE准备用从牛棚跑到池塘的方法来锻炼 ...
- bzoj 1598: [Usaco2008 Mar]牛跑步【A*K短路】
A*K短路模板,详见https://blog.csdn.net/z_mendez/article/details/47057461 算法流程: 把有向图全建成反向边,跑一遍所有点到t的最短路记为dis ...
- bzoj:1598: [Usaco2008 Mar]牛跑步
Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M ...
- 【BZOJ】1598: [Usaco2008 Mar]牛跑步
[题意]给定有向图,边严格从大编号指向小编号,求前k短路.n<=1000,m<=10000,k<=100. [算法]归并+拓扑排序||A*求第k短路 [题解]因为此题自带拓扑序的特殊 ...
- BZOJ_1598_[Usaco2008 Mar]牛跑步_A*
BZOJ_1598_[Usaco2008 Mar]牛跑步_A* Description BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. B ...
- K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院
A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...
- BZOJ1598: [Usaco2008 Mar]牛跑步
传送门 K短路,普遍的算法是采用AStar求解,先建立反向边跑一遍dij,或者spfa什么的.跑出反向边的距离就可以看为估价函数中的$h()$.设$dist$为当前已经走过的距离,那么$f(node) ...
- 【bzoj1598】【 [Usaco2008 Mar]牛跑步】启发式搜索思路+spfa
(上不了p站我要死了,侵权度娘背锅) 最近复习搜索,先从启发式搜索来吧. 感觉启发式搜索这玩意挺玄学的,先从其思想入手,做一道经典的K短路. Description BESSIE准备用从牛棚跑到池塘的 ...
随机推荐
- 2017ecjtu-summer training #4 UESTC 1584
此题链接 http://acm.uestc.edu.cn/#/problem/show/1584 此题和hdu1541几乎完全一样,我们要先对坐标排序,再进行操作. hdu1541题解 http:// ...
- 如何使用padlepadle 进行意图识别-开篇
前言 意图识别是通过分类的办法将句子或者我们常说的query分到相应的意图种类.举一个简单的例子,我想听周杰伦的歌,这个query的意图便是属于音乐意图,我想听郭德纲的相声便是属于电台意图.做好了意图 ...
- UEP-时间的比较
时间的比较: var rec = ajaxform.getRecord(); var sd = rec.get("startDate"); var ed = rec.get(&qu ...
- [国嵌攻略][163][linux-usb软件系统架构]
软件系统架构 1.主机端软件架构 USB设备驱动->USB核心->USB主控制器驱动->USB主控制器 2.设备端软件架构 Gadget驱动->Gadget API->U ...
- HDU 5122 K.Bro Sorting(模拟——思维题详解)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5122 Problem Description Matt's friend K.Bro is an A ...
- 如何检测浏览器url变化
用户通过“点击触发”,“操作历史”,“直接访问URL”的方式修改当前URL.这三种触发方式会使浏览器做出不同的行为 html5提供了两种方式在页面中操作历史 history.pushState(sta ...
- dede后台登陆后一片空白的解决办法汇总
dede后台登陆后一片空白的第一种解决办法: 找到:include/common.inc.php文件,打开,查找程序代码://error_reporting(E_ALL);error_reportin ...
- 邓_laravel框架——news
----------------------------------------------------------------------------------- [laravel框架] 路由+中 ...
- zTree中父节点禁用,子节点可以用
参考学习网址:http://www.treejs.cn/v3/main.php#_zTreeInfo zTree中父节点禁用,子节点可以用 axios.get('/base/unit/unittree ...
- Spring学习之路二——概念上理解Spring
一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...