手写堆的dijkstra
颓废。。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn=1e5+, maxm=1e6+, INF=; struct Heap_node{
int value, id;
void reset(){
value=, id=;
return;
}
}; bool operator< (Heap_node A, Heap_node B){
if (A.value>B.value) return true;
else return false;
} class Heap{
private:
int pos[maxn];
Heap_node heap[maxn]; void exchange(int x, int y){
pos[heap[x].id]=y;
pos[heap[y].id]=x;
swap(heap[x], heap[y]);
} void pushup(int now){
while (now!=&&heap[now>>]<heap[now]){
exchange(now, now>>);
now>>=;
}
return;
} void pushdown(int now){
bool son1, son2, flag=true;
while ((now<<)<=n&&flag){
flag=false;
son1=true, son2=true;
if ((now<<|)>n) son2=false;
if (son2&&heap[now<<]<heap[now<<|]) son1=false;
else son2=false;
if (son1&&heap[now]<heap[now<<]) {
exchange(now, now<<);
now<<=;
flag=true;
}
if (son2&&heap[now]<heap[now<<|]){
exchange(now, now<<|);
now=now<<|;
flag=true;
}
}
return;
} public:
int n;
Heap(){
n=;
for (int i=; i<maxn; ++i) heap[i].reset();
} void push(int num, int id){
pos[id]=++n;
heap[n].id=id;
heap[n].value=num;
pushup(n);
return;
} void del(int now){
pos[heap[n].id]=now;
pos[heap[now].id]=;
heap[now]=heap[n--];
pushdown(now);
pushup(now); //
} void delid(int id){
int now=pos[id];
del(now);
return;
} void modify(int value, int id){
delid(id);
push(value, id);
return;
} bool empty(){
return !n;
} Heap_node top(){
return heap[];
}
}; struct Edge{
int to, v, next;
}; struct Graph{
int n, m, cntedge;
int fir[maxn];
Edge link[maxn];
Edge edge[maxm]; void init(int nodenum, int edgenum){
n=nodenum, m=edgenum;
} Graph(){
memset(fir, , sizeof(fir));
memset(edge, , sizeof(edge));
cntedge=;
n=;
m=;
return;
} void addedge(int x, int y, int v){
++cntedge;
edge[cntedge].to=y;
edge[cntedge].v=v;
edge[cntedge].next=fir[x];
fir[x]=cntedge;
return;
} Edge *get_link(int x){
int cnt=;
for (int nowedge=fir[x]; nowedge;
nowedge=edge[nowedge].next){
link[++cnt]=edge[nowedge];
}
link[].v=cnt;
return link;
} }; int n, m, s;
int dis[maxn];
Edge *link; Heap h;
Graph g; int main(){
scanf("%d%d%d", &n, &m, &s);
g.init(n, m);
int f, gg, w;
for (int i=; i<m; ++i){
scanf("%d%d%d", &f, &gg, &w);
g.addedge(f, gg, w);
}
for (int i=; i<=n; ++i){
dis[i]=INF;
h.push(INF, i);
}
dis[s]=;
h.modify(, s);
int now, nowson, nowdis;
while (!h.empty()){
now=h.top().id;
h.del();
if (dis[now]==INF) break;
link=g.get_link(now);
for (int i=; i<=link[].v; ++i){ //注意总共最多访问到2m条边,因此时间复杂度为mlogn
nowson=link[i].to;
nowdis=link[i].v;
if (dis[now]+nowdis<dis[nowson]){
dis[nowson]=dis[now]+nowdis;
h.modify(dis[nowson], nowson);
}
}
}
for (int i=; i<=n; ++i)
printf("%d ", dis[i]);
return ;
}
手写堆的dijkstra的更多相关文章
- 手写堆优化dijkstra
\(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\) 添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数 而这一方法需要依托手写堆 #incl ...
- spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111
http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...
- Luogu [P1334] 瑞瑞的木板(手写堆)
其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...
- AC日记——手写堆ac合并果子(傻子)
今天整理最近的考试题 发现一个东西叫做优先队列 priority_queue(说白了就是大根堆) 但是 我对堆的了解还是很少的 所以 我决定手写一个堆 于是我写了一个简单的堆 手写的堆说白了就是个二叉 ...
- hihoCoder 第136周 优化延迟(二分答案+手写堆)
题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...
- [转载] 管Q某犇借的手写堆
跟gxy大神还有yzh大神学了学手写的堆,应该比stl的优先队列快很多. 其实就是维护了一个二叉堆,写进结构体里,就没啥了... 据说达哥去年NOIP靠这个暴力多骗了分 合并果子... templat ...
- BZOJ 1975 魔法猪学院(A*+手写堆)
1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1941 Solved: 595 [Submit][Sta ...
- 手写堆_C++
一般主程序中拿堆顶元素 x=h[]; h[]=h[top--]; down(); 在堆尾加入元素 h[++top]=x; up(top); 上浮下沉操作 inline void up(int x) { ...
- 堆优化Dijkstra算法
但是,我们会发现刚刚讲的朴素Dijkstra算法(高情商:朴素 : 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间: 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新 ...
随机推荐
- delphi完美经典-第16章 Delphi数据库程序设计----使用BDE组件
第16章 Delphi数据库程序设计----使用BDE组件 Delphi访问数据库的方式有:ADO.BDE.dbExpress.InterBase Express. 一.TDataSet组件 虽然De ...
- [原创]Java开发在线编辑Word同时实现全文检索
一.背景介绍 Word文档与日常办公密不可分,在实际应用中,当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,一般情况下能想到的解决方案是 ...
- ROS 负载均衡
[xuan89@MikroTik] > :for i from=1 to=$z do= {/ip firewall mangle add action=mark-connection chain ...
- bzoj1000~1025
以后还是这样 25道题一起发 看着爽 noip失利之后发粪涂墙 刷了一波bzoj 题解: bzoj1000 A+B问题 这题不同的人有不同的写法,我写了个线段树套Treap,应该还是挺简单的 但是看别 ...
- 清理:db上面的过期的binlog,释放磁盘空间。 (转)
如果10台以内的db的话,自己手动ssh进去,clean就足以,但是上百台呢,就要写脚本了.大概思路:在 一台db跳转机上面, 写一个脚本,访问slave,远程获取正在复制的master上面的binl ...
- Ubuntu18.04安装Docker, centos7安装Docker
Ubuntu18.04安装Docker 第一种方法从Ubuntu的仓库直接下载安装: 安装比较简单,这种安装的Docker不是最新版本,不过对于学习够用了,依次执行下面命令进行安装. $ sudo a ...
- 九 fork/join CompletableFuture
1: Fork/join fork/join: fork是分叉的意思, join是合并的意思. Fork/Join框架:是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务 ...
- elasticsearch2.x插件之一:bigdesk
bigdesk是elasticsearch的一个集群监控工具,可以通过它来查看es集群的各种状态,如:cpu.内存使用情况,索引数据.搜索情况,http连接数等. 可用项目git地址:https:// ...
- MQTT,XMPP,STOMP,AMQP,WAMP适用范围优缺点比较
想要向服务器发送请求并获得响应?直接使用 HTTP 吧!非常简单.但是当需要通过持久的双向连接来通信时,如 WebSockets,当然你也有其它的选择. 这篇文章会简单扼要的解释 MQTT,XMPP, ...
- C++经典题目:有n个整数,使前面各数顺序向后移动m个位置
问题描述: 有n个整数,使前面各数顺序向后移动m个位置,最后m个数变成最前m个数. 程序代码: #include<iostream> #define MAXLEN 200 using na ...