BZOJ 1975 SDOI2010 魔法猪学院 A*k短路
题目大意:给定一个值E 求起点到终点的最多条路径 使长度之和不超过E
k短路的A*算法……每一个点有一个估价函数=g[x]+h[x] 当中g[x]是从源点出发已经走了的长度 h[x]是从这个点到汇点的最短路
首先先在反图上跑一遍SPFA求出每一个点的h[x],然后将源点的g[x]+h[x]增加堆 每次取出堆顶时将堆顶的g[x]向所连接的边扩展 第k次取出汇点即是答案
当中有一个剪枝就是当第k+1次取出某个点时不继续拓展 防止MLE 可是这里k未知 我们能够对k进行估价处理 初始k=floor(E/最短路长度) 然后每次取出汇点时更新k k=cnt[n]+floor(E/当前路径长度)
比較丧病的是这题卡priority_queue……这东西的内存是手写堆的二倍 因为卡内存 所以会挂 能够手写堆 我写了可并堆+垃圾回收……
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 5050
using namespace std;
struct abcd{
int pos;
double g,h;
bool operator < (const abcd &x) const
{
return g + h < x.g + x.h ;
}
};
struct Heap{
abcd num;
Heap *ls,*rs;
void* operator new (size_t size,int pos,double g,double h);
void operator delete (void* p);
}*root,*mempool,*C;
struct edge{
int to,next;
double f;
}table[400400];
int head[M],tot=1;
bool flag;
queue<void*> bin;
int n,m,k,ans,cnt[M];
double e,f[M];
void* Heap :: operator new (size_t size,int pos,double g,double h)
{
if( !bin.empty() )
{
Heap *re=(Heap*)bin.front();
bin.pop();
re->num.pos=pos;
re->num.g=g;
re->num.h=h;
re->ls=re->rs=0x0;
return re;
}
if(C==mempool)
{
C=new Heap[1<<15];
mempool=C+(1<<15);
}
C->num.pos=pos;
C->num.g=g;
C->num.h=h;
C->ls=C->rs=0x0;
return C++;
}
void Heap :: operator delete (void *p)
{
bin.push(p);
}
Heap* Merge(Heap *x,Heap *y)
{
if(!x) return y;
if(!y) return x;
if( y->num < x->num )
swap(x,y);
if(flag^=1)
x->ls=Merge(x->ls,y);
else
x->rs=Merge(x->rs,y);
return x;
}
inline void Insert(int pos,double g,double h)
{
root=Merge(root,new (pos,g,h) Heap);
}
inline void Pop()
{
delete root;
root=Merge(root->ls,root->rs);
}
void Add(int x,int y,double z)
{
table[++tot].to=y;
table[tot].f=z;
table[tot].next=head[x];
head[x]=tot;
}
void SPFA()
{
static int q[1<<16];
static unsigned short r,h;
static bool v[M];
int i;
memset(f,0x42,sizeof f);
f[n]=0;q[++r]=n;
while(r!=h)
{
int x=q[++h];v[x]=0;
for(i=head[x];i;i=table[i].next)
if( i&1 && f[table[i].to]>f[x]+table[i].f )
{
f[table[i].to]=f[x]+table[i].f;
if(!v[table[i].to])
v[table[i].to]=1,q[++r]=table[i].to;
}
}
}
void A_Star()
{
int i;
k=static_cast<int>(e/f[1])+1;
Insert(1,0,f[1]);
while(root)
{
abcd x=root->num;Pop();
if( ++cnt[x.pos]>k )
continue;
if(x.pos==n)
{
if(e-x.g<0) return ;
e-=x.g;++ans;
k=cnt[n]+static_cast<int>(e/x.g)+1;
}
for(i=head[x.pos];i;i=table[i].next)
if(~i&1)
Insert(table[i].to,x.g+table[i].f,f[table[i].to]);
}
}
int main()
{
int i,x,y;
double z;
cin>>n>>m>>e;
for(i=1;i<=m;i++)
{
scanf("%d%d%lf",&x,&y,&z);
Add(x,y,z);
Add(y,x,z);
}
SPFA();
A_Star();
cout<<ans<<endl;
return 0;
}
BZOJ 1975 SDOI2010 魔法猪学院 A*k短路的更多相关文章
- bzoj 1975 [Sdoi2010]魔法猪学院(k短路)
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1357 Solved: 446[Submit][Statu ...
- bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]
1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...
- bzoj 1975 [Sdoi2010]魔法猪学院
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1758 Solved: 557[Submit][Statu ...
- bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2446 Solved: 770[Submit][Statu ...
- BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...
- BZOJ 1975: [Sdoi2010]魔法猪学院 大水题 第k短路 spfa
https://www.lydsy.com/JudgeOnline/problem.php?id=1975 我好像到现在了第k短路都不会写,mdzz. 先spfa求出最短路,然后扫点存各种前置路径已经 ...
- 洛谷 P2483 BZOJ 1975 [SDOI2010]魔法猪学院
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- [SDOI2010]魔法猪学院(k短路)
A*板子题.我的code只能在luogu上过,bzoj上RE/MLE不清楚为啥. 蒟蒻到AFO前2个月不到的时间才学A*,A*其实就是bfs过程中进行剪支删除没必要的搜索.然后其实上这样剪支即可:如果 ...
随机推荐
- 利用开源HTML5引擎lufylegend.js结合javascript实现的五子棋人机对弈
前言 本文主要介绍利用开源引擎 lufylegend.js开发基于Html5的游戏--五子棋,主要叙述其详细开发过程. 游戏规则 玩过五子棋的都应该知道五子棋的规则,这里就简单介绍其规则. 1 ...
- Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind at ...
- jQuery选择
1.基本的选择 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29tZW9uc3RvbmU=/font/5a6L5L2T/fontsize/400/fil ...
- [置顶] 大量相关gis资源网盘打包下载
详细请下载附件 所有资源下载(网盘下载): http://laoheitan.bego.cc arcgis教程: http://www.bego.cc/file/23322579 ENVI教程: ht ...
- DRP之Oracle_11g数据库安装
不知道大家在安装了Oracle数据库的时候有没有这样或那样的困惑,今天这篇文章就把Oracle数据库的安装过程理一下,作为总结,方便以后的学习. 首先,将下载的两个文件放在一个目录下解压,然后打开文件 ...
- 从iReport至Jaspersoft Studio
这篇文章同步到http://www.waylau.com/from-ireport-to-jaspersoft-studio/ 从5.5版本号開始,Jaspersoft Studio将代替iRepor ...
- tomcat各版本和jsp、jstl、servlet的依赖关系(转)
Servlet / JSP / Tomcat Version Servlet/ JSP Tomcat 2.5/2.1 6.0.18 2.4/2.0 5.5.27 2.3/1.2 4.1.3 ...
- python安装依赖
yum install zlib zlib-devel openssl openssl-devel bzip2 bzip2-devel ncurses ncurses-devel readline r ...
- Python学习笔记22:Django下载并安装
Django它是一个开源Web应用程序框架.由Python书面. 通过MVC软件设计模式,这种模式M,视图V和控制器C. 它最初是一个数字新闻内容为主的网站已经发展到管理劳伦斯出版集团.那是,CMS( ...
- springMVC中一个class中的多个方法
在前面.已经可以利用SpringMVC进行简单的例子了,但是,在controller中我们实现了Controller接口.这样就必须实现handleRequest(HttpServletRequest ...