手写堆的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算法(高情商:朴素 : 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间: 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新 ...
随机推荐
- c语言代码风格2
1.注释 注释的目的是为了说明做了什么,而不是怎么做,所以注释表达应该准确而又简洁.注释要放在被注释内容的上方或右方.注释一般采用/*.........*/或//........ 对代码源文件和函数应 ...
- BEC listen and translation exercise 44
But over the past 70 years or so, there's been a massive increase in one type of crime which was wha ...
- stl_stack.h
stl_stack.h // Filename: stl_stack.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http:/ ...
- android 应用程序Activity之间数据传递与共享的几种途径
一.基于消息的通信机制 Intent ---boudle ,extraAndroid为了屏蔽进程的概念,利用不同的组件[Activity.Service]来表示进程之间的通信!组件间通信的核心机制是I ...
- Cannot find PHPUnit in include path (.;C:\php5\pear)
--pear channel-discover pear.phpunit.de --pear install phpunit/PHPUnit 此时会显示: No valid packages foun ...
- 高级Java工程师必备 ----- 深入分析 Java IO (二)NIO
接着上一篇文章 高级Java工程师必备 ----- 深入分析 Java IO (一)BIO,我们来讲讲NIO 多路复用IO模型 场景描述 一个餐厅同时有100位客人到店,当然到店后第一件要做的事情就是 ...
- 11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump
OCR备份 OCR的备份有2种方式,自动备份和手工备份. 自动备份策略: Oracle Clusterware 每隔4小时,CRSD 进程会自动对OCR 进行一次备份,在任意时刻,oracle 总会保 ...
- JAVA基础知识(12)-----同步
好处:解决了线程安全问题.弊端:相对降低性能,因为判断锁需要消耗资源,产生了死锁.定义同步是有前提的:1,必须要有两个或者两个以上的线程,才需要同步.2,多个线程必须保证使用的是同一个锁. 同步的第二 ...
- Jumony.Core非常厉害的一个开源项目!
简单的说,就是解析html文档的,以前发送一个get请求获取一个页面的html文本后,想要获取里面的数据都是使用正则表达式.(非常的苦逼), 现在用这个获取就very easy! 安装的话在Nu Ge ...
- 动态Result配置
步骤一:建立DynaAction,主要代码如下: package com.asm; public class DynaAction extends ActionSupport { private St ...