题目大意:给定一个值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短路的更多相关文章

  1. bzoj 1975 [Sdoi2010]魔法猪学院(k短路)

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  2. Bzoj 1975: [Sdoi2010]魔法猪学院 dijkstra,堆,A*,K短路

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1357  Solved: 446[Submit][Statu ...

  3. bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]

    1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...

  4. bzoj 1975 [Sdoi2010]魔法猪学院

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1758  Solved: 557[Submit][Statu ...

  5. bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2446  Solved: 770[Submit][Statu ...

  6. BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...

  7. BZOJ 1975: [Sdoi2010]魔法猪学院 大水题 第k短路 spfa

    https://www.lydsy.com/JudgeOnline/problem.php?id=1975 我好像到现在了第k短路都不会写,mdzz. 先spfa求出最短路,然后扫点存各种前置路径已经 ...

  8. 洛谷 P2483 BZOJ 1975 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  9. [SDOI2010]魔法猪学院(k短路)

    A*板子题.我的code只能在luogu上过,bzoj上RE/MLE不清楚为啥. 蒟蒻到AFO前2个月不到的时间才学A*,A*其实就是bfs过程中进行剪支删除没必要的搜索.然后其实上这样剪支即可:如果 ...

随机推荐

  1. java中遍历MAP,嵌套map的几种方法

    java中遍历MAP的几种方法 Map<String,String> map=new HashMap<String,String>();    map.put("us ...

  2. 网络数据(socket)传输总结

    环境限定:TCP/IP下的socket网络传输:C/C++开发语言,32/64位机. 目前有两种方式对数据进行传输:1)字符流形式,即将数据用字符串表示:2)结构型方式,即将数据按类型直接传输. 1) ...

  3. 【老鸟学算法】包含 min函数的栈设计——java实现

    要求: 1. 定义栈的数据结构,要求添加一个 min函数,能够得到栈的最小元素. 2. 要求函数 min.push 以及 pop 的时间复杂度都是 O(1). 这是考验“栈”数据结构设计.众所周知,栈 ...

  4. 与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密

    原文:与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密 [索引页][源码下载] 与众不同 wi ...

  5. MySQL字符串函数、日期时间函数

    MySQL字符串函数.日期时间函数 一.常见字符串函数: 1.CHAR_LENGTH  获取长度(字符为单位) 2.FORMAT  格式化 3.INSERT  替换的方式插入 4.INSTR  获取位 ...

  6. POJ 2826 An Easy Problem?! 好的标题

    受该两块木板以形成槽的效果.Q槽可容纳雨水多,注意雨爆跌,思想是非常easy,分类讨论是有点差. 1.假定两条线段不相交或平行,然后再装0: 2.有一个平行x轴.连衣裙0. 3.若上面覆盖以下的,装0 ...

  7. Selenium 验证picklist是可被正确选中且是有序的(动态数组赋值)

    原代码: <select id="edit-submitted-im-interesting-in" class="form-select required&quo ...

  8. A Game of Thrones(14) - Catelyn

    Ned and the girls were eight days gone when Maester Luwin came to her one night in Bran’s sickroom, ...

  9. android4.3环境搭建

    方案一: 首先android环境搭建有如下几个东西是必须准备的: 1.  Eclipse (下载地址:http://www.eclipse.org/downloads/,建议至少3.4及以上版本) 2 ...

  10. 向GridView的模板列绑定OnClientClick的函数时出现了奇怪的问题

    原文:向GridView的模板列绑定OnClientClick的函数时出现了奇怪的问题 GridView的一个模板列中的内容是按钮,需要实现以下的效果: GridView分页显示数据,点击编辑按钮(模 ...