你谷数据够强了,以前的A*应该差不多死掉了。

所以,小伙伴们快来一起把YL顶上去把!戳这里!

俞鼎力的课件

需要掌握的内容:

Dijkstra构建最短路径树。

可持久化堆(使用左偏树,因其有二叉树结构且能动态合并。构建方法类似可持久化线段树)。

#include<bits/stdc++.h>
#define RG register
#define R RG int
using namespace std;
const int N=5009,M=4e5+9;
int p,he[N],re[N],ne[M],to[M],f[N],rt[N];
double w[M],d[N];bool vis[N];
struct Heap{
double w;
int lc,rc,dep,end;
}t[M];//不要问我为什么过了
struct Node{
double w;int x;
inline bool operator<(RG Node a)const{
return w>a.w;
}
};
priority_queue<Node>q;
int merge(R x,R y,R op){//左偏树合并,op控制是否复制版本
if(!(x&&y))return x+y;
if(t[x].w>t[y].w)swap(x,y);
if(op)t[++p]=t[x],x=p;
t[x].rc=merge(t[x].rc,y,op);
if(t[t[x].lc].dep<t[t[x].rc].dep)swap(t[x].lc,t[x].rc);
t[x].dep=t[t[x].rc].dep+1;
return x;
}
int main(){
ios::sync_with_stdio(0);
R n,m,i,x,y,ans=0;
RG double E,now;
cin>>n>>m>>E;
for(i=1;i<=m;++i){
cin>>x>>y>>w[i];
ne[ i ]=he[x];to[he[x]= i ]=y;
ne[i+m]=re[y];to[re[y]=i+m]=x;
}
for(x=1;x<n;++x)d[x]=1e18;
q.push((Node){0,n});//Dijkstra开始
while(!q.empty()){
x=q.top().x;q.pop();
if(vis[x])continue;
vis[x]=1;
for(i=re[x];i;i=ne[i])
if(d[y=to[i]]>d[x]+w[i-m])
q.push((Node){d[y]=d[x]+w[i-m],y});
}
for(x=1;x<=n;++x){
if(d[x]==1e18)continue;
for(i=he[x];i;i=ne[i]){
if(d[x]==d[y=to[i]]+w[i]&&!f[x])f[x]=y;//构建最短路树
else if(d[y]!=1e18){
t[++p]=(Heap){d[y]+w[i]-d[x],0,0,1,y};
rt[x]=merge(rt[x],p,0);
}
}
q.push((Node){d[x],x});
}
while(!q.empty()){
x=q.top().x;q.pop();
if(f[x])rt[x]=merge(rt[x],rt[f[x]],1);//可持久化
}
if(E>=d[1])E-=d[1],++ans;
if(rt[1])q.push((Node){t[rt[1]].w,rt[1]});
while(!q.empty()){
now=q.top().w;x=q.top().x;q.pop();
if(E<now+d[1])break;
E-=now+d[1];++ans;
if((y=t[x].lc))q.push((Node){now-t[x].w+t[y].w,y});
if((y=t[x].rc))q.push((Node){now-t[x].w+t[y].w,y});
if((y=rt[t[x].end]))q.push((Node){now+t[y].w,y});
}
printf("%d\n",ans);
return 0;
}

k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)的更多相关文章

  1. 洛谷 P2483 [SDOI2010]魔法猪学院

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

  2. 洛谷——P2483 [SDOI2010]魔法猪学院

    https://www.luogu.org/problem/show?pid=2483 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的 ...

  3. P2483 [SDOI2010]魔法猪学院

    P2483 [SDOI2010]魔法猪学院 摘要 --> 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世 ...

  4. [BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)

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

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

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

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

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

  7. BZOJ1975 [Sdoi2010]魔法猪学院 k短路

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...

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

    Description 找出1~k短路的长度.   Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...

  9. BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)

    对反图跑最短路求出每个点到终点的最短路径,令其为估价函数大力A*,第k次到达某个点即是找到了到达该点的非严格第k短路,因为估价函数总是不大于实际值.bzoj可能需要手写堆.正解是可持久化可并堆,至今是 ...

随机推荐

  1. InvalidDataAccessResourceUsageException:mysql保留字引发的血案

    org.springframework.dao.InvalidDataAccessResourceUsageException: could NOT EXECUTE statement; SQL [n ...

  2. 【问题解决方案】从 Anaconda Prompt 或 Jupyter Notebook 终端进入Python后重新退出到命令状态

    从 Anaconda Prompt 或 Jupyter Notebook 终端进入Python后重新退出到命令状态 退出Python:exit() 或者 Ctrl+z 例子一枚 默认打开的是3.7,需 ...

  3. Linux中profile

    http://www.cnblogs.com/mmfzmd517528/archive/2012/07/05/2577988.html

  4. node错误中间件处理 express类 带有路由操作

    let express = require('express'); let app = new express(); let bodyParser = require('body-parser'); ...

  5. Redis 安装学习

    Linux下下载安装redis https://redis.io/download tar -zvxf redisxxx cd redisxxxx make  ---进行安装 vim ~.bash_p ...

  6. 查找文献的BibTex

    BibTex可以通过Google Scholar来查找. 注意,默认情况下,Google scholar 关闭了显示BibTex链接. 打开Google Scholar 选择右上角菜单按钮 选择set ...

  7. Mybatis+Spring整合后Mapper测试类编写

    public class UserMapperTest { private ApplicationContext applicationContext; @Before public void ini ...

  8. js删除数组元素

    一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...

  9. 关于 flask 实现数据库迁移以后 如何根据创建的模型类添加新的表?

    在此之前 我们先说一下常规的flask运用第三方扩展来实现数据库的迁移的三个步骤以及每步的目的. 数据库的迁移的三个步骤:(cd 到run.py所在路径) python run.py db init ...

  10. How to remove unwant Explorer Context Menu

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell