k短路模板(洛谷P2483 [SDOI2010]魔法猪学院)(k短路,最短路,左偏树,priority_queue)
你谷数据够强了,以前的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)的更多相关文章
- 洛谷 P2483 [SDOI2010]魔法猪学院
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- 洛谷——P2483 [SDOI2010]魔法猪学院
https://www.luogu.org/problem/show?pid=2483 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的 ...
- P2483 [SDOI2010]魔法猪学院
P2483 [SDOI2010]魔法猪学院 摘要 --> 题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世 ...
- [BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2748 Solved: 883[Submit][Statu ...
- bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]
1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...
- BZOJ 1975: [Sdoi2010]魔法猪学院——K短路,A*
传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1975 题意&简要做法 一张有向图,求出最多的互不相同的路径,满足路径长度之和\(\l ...
- BZOJ1975 [Sdoi2010]魔法猪学院 k短路
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...
- 【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院
Description 找出1~k短路的长度. Solution k短路的求解要用到A*算法 A*算法的启发式函数f(n)=g(n)+h(n) g(n)是状态空间中搜索到n所花的实际代价 h(n) ...
- BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)
对反图跑最短路求出每个点到终点的最短路径,令其为估价函数大力A*,第k次到达某个点即是找到了到达该点的非严格第k短路,因为估价函数总是不大于实际值.bzoj可能需要手写堆.正解是可持久化可并堆,至今是 ...
随机推荐
- 软件工程练习:模块化,单元测试,回归测试,TDD
这是<构建之法>实战教学的一部分.适合作为同学们的第二个程序作业. 第一个程序作业: 请看 “概论” 一章的练习,或者老师的题目,例如这个. 作业要求: 软件工程的作业越来越有意思了, 我 ...
- python的循环和选择
一.python的选择结构: python的选择结构有两种选择结构一种是单选择(if...else)另一种则是多选择结构(if ...elif...elif) 下面用代码来实现: 1.if....el ...
- iframe跨域解决方案
公司某个功能用的是iframe,由于跨域的原因,我们不能直接设置父级页面iframe的高度,所以用了一个中间页home来完成父级页面iframe的高度设置,这种中间页其实很多时候不好用,因为涉及到页面 ...
- SQL UPDATE with INNER JOIN
mysql - SQL UPDATE with INNER JOIN - Stack Overflowhttps://stackoverflow.com/questions/14491042/sql- ...
- Eclipse External Tool Configration Notepad++
Location: C:\Program Files\Notepad++\notepad++.exe Arguments: ${resource_loc}
- connect、resource和dba三种标准角色
授权语句:grant connect,resource,dba to zwserver 经过授权以后,用户拥有connect.resource和dba三个角色的权限: (1)Connect 角色,是授 ...
- [转帖]Linux分页机制之概述--Linux内存管理(六)
Linux分页机制之概述--Linux内存管理(六) 2016年09月01日 19:46:08 JeanCheng 阅读数:5491 标签: linuxkernel内存管理分页架构更多 个人分类: ┈ ...
- Linux下面将windows写的脚本转换成 Linux 格式的文件
1.接着上一篇blog 发现有一个问题 vim 打开文件 发现最下面有一行信息: 2. 里面有一些 不一样的地方. linux里面没法执行 ,如果想执行的话 可以输入命令 :set fileforma ...
- FindBugs-IDEA插件的使用
前言 Findbugs很多人都并不陌生,Eclipse中有插件可以帮助查找代码中隐藏的bug,IDEA中也有这款插件.这个插件可以帮助我们查找隐藏的bug,比较重要的功能就是查找潜在的null指针. ...
- app自动化测试Appium+python
一.node.js安装 https://nodejs.org/en/download/ ##一直下一步 ###cmd查看 二. .NET Framework安装 https://www.micros ...