【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
Description
Solution
k短路的求解要用到A*算法
A*算法的启发式函数f(n)=g(n)+h(n)
g(n)是状态空间中搜索到n所花的实际代价
h(n)是n到结束状态最佳路径的估计代价
关于h(n)的选取,当h(n)<实际代价时,搜索慢但可出解;h(n)=实际代价时,正确率与效率最高;h(n)>实际代价,快但只能得到近似解。
但在k短路问题中,h(n)是可以选到准确值的,就是n到结束节点的最短路,预处理时从结束节点做一次单源最短路即可。
按广搜的方式扩展节点,每次优先扩展f(n)最小的节点。
第i次扩展到目标节点,代表找到了第i短路。
正确性什么的很好理解。
k短路关于A*部分代码很简洁,用优先队列维护。
这道题就是裸题,但这道题很丧病地让proirity_queueMLE,于是要手写堆。
让我这个几乎没手写过堆的STL狗QwQ
Code
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int N=5e3+,M=2e5+; double d[N];
int head[N],e[M],nxt[M],cnt;
double w[M];
int adde(int u,int v,double g){
e[++cnt]=v;w[cnt]=g;nxt[cnt]=head[u];head[u]=cnt;
}
int _head[N],_e[M],_nxt[M],_cnt;
double _w[M];
int _adde(int u,int v,double g){
_e[++_cnt]=v;_w[_cnt]=g;_nxt[_cnt]=_head[u];_head[u]=_cnt;
}
struct node{
double f,g;
int o;
bool operator<(const node&a)
const{return f<a.f;}
};
int n,m;
double c; queue<int>q;
int inque[N];
int spfa(){
memset(d,,sizeof(d));
d[n]=;
inque[n]=;
q.push(n); while(!q.empty()){
int u=q.front();q.pop();
for(int i=_head[u];i;i=_nxt[i]){
int v=_e[i];
if(d[v]>d[u]+_w[i]){
d[v]=d[u]+_w[i];
if(!inque[v]){
q.push(v);
inque[v]=;
}
}
}
inque[u]=;
}
} int ans,size;
node Q[];
int push(node x){
int now,next;
Q[++size]=x;
now=size;
while(now>){
next=now>>;
if(Q[next]<Q[now]) break;
swap(Q[now],Q[next]);
now=next;
}
}
node pop(){
int now,next;
node ret;
ret=Q[];
Q[]=Q[size--];
now=;
while((now<<)<=size){
next=now<<;
if(next<size&&Q[next+]<Q[next]) next++;
if(Q[now]<Q[next]) break;
swap(Q[now],Q[next]);
now=next;
}
return ret;
}
void Astar(){
push((node){d[],,});
while(size){
node x=pop();
for(int i=head[x.o];i;i=nxt[i]){
int v=e[i];
push((node){x.g+w[i]+d[v],x.g+w[i],v});
}
if(x.o==n){
c-=x.f;
if(c<) return;
ans++;
}
}
} int main(){
scanf("%d%d%lf",&n,&m,&c);
int u,v; double g;
for(int i=;i<=m;i++){
scanf("%d%d%lf",&u,&v,&g);
adde(u,v,g);
_adde(v,u,g);
} spfa();
Astar(); printf("%d\n",ans);
return ;
}
【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院的更多相关文章
- bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2446 Solved: 770[Submit][Statu ...
- [BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2748 Solved: 883[Submit][Statu ...
- BZOJ1975 [Sdoi2010]魔法猪学院 k短路
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...
- BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)
对反图跑最短路求出每个点到终点的最短路径,令其为估价函数大力A*,第k次到达某个点即是找到了到达该点的非严格第k短路,因为估价函数总是不大于实际值.bzoj可能需要手写堆.正解是可持久化可并堆,至今是 ...
- BZOJ1975 [Sdoi2010]魔法猪学院
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- 洛谷P2483 Bzoj1975 [SDOI2010]魔法猪学院
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- BZOJ1975 SDOI2010魔法猪学院
就是个A*,具体原理可以参考VANE的博文. 正解要手写堆,会被卡常,也许哪天我筋搭错了写一回吧. #include<bits/stdc++.h> #define r register u ...
- K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院
A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...
随机推荐
- 使用Cli构建Go的命令行应用
转载出处:http://www.opscoder.info/cli.html 在Go里面应用中flag这一标准库,提供了很多我们在写命令行时需要的interface,然而如果你需要更强大更好的结构 ...
- nginx flv点播服务器搭建
首先选用Nginx+Nginx-rtmp-module作为点播服务器,安装文章:https://www.atlantic.NET/community/howto/install-rtmp-ubuntu ...
- myeclipse2014鼠标单击后光标位置背景底色为白色太难看,行号显示
Java文件的修改方法: window--Preferences--Java--Editor--Mark Occurences JS文件中点击字符串就会变成白色背景 JS文件字体颜色的修改 windo ...
- MyBatis打印SQL执行时间
1.plugins MyBatis官网对于plugins的描述是这样的: MyBatis allows you to intercept calls to at certain points with ...
- jQuery的学习笔记4
JQuery学习笔记3 2.9属性选择器 属性选择器就是根据元素的属性和属性值作为过滤条件,来匹配对应的DOM元素.属性选择器一般都以中括号作为起止分界符 它的形式如下: [attribute] [a ...
- SpringBoot Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.
使用SpringBoot写HelloWorld,当配置好启动类后,再创建新的controller或其它类,启动项目后访问对应的映射名,页面显示: Whitelabel Error Page This ...
- Ubuntu16+pinpoint环境搭建
最近研究了pinpoint,稍后放上环境搭建教程,建议想学习搭建的同学记得参考pinpointGitHub
- struts升级2.3.12到2.5.13
参考文章: http://www.ituring.com.cn/article/495914 http://blog.csdn.net/zhangchen1987/article/details/78 ...
- Python_性能测试
使用pip安装Python扩展库memory_profiler from memory_profiler import profile @profile #修饰器 def isPrime(n): if ...
- Python_内置四种队列
from queue import Queue #LILO队列q = Queue() #创建队列对象q.put(0) #在队列尾部插入元素q.put(1)q.put(2)print('LILO队列', ...