手写堆的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算法(高情商:朴素 : 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间: 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新 ...
随机推荐
- Delpih - Format
Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用: 首先看它的声明:function Format(const Format: ...
- myeclipse+maven
1.Windows-->Preferences-->MyEclipse-->Maven4MyEclipse 2.Installations-->Add:添加Mavan 3.Us ...
- php判断是否是微信浏览器
php判断是否是微信浏览器 直接上代码: <?PHP function is_wechat_browser(){ $user_agent = $_SERVER['HTTP_USER_AGENT' ...
- web前端绘制0.5像素的几种方法
最近完成了公司安排的移动web触屏开发,期间涉及到在移动设备上显示线条,最开始采用PC常用的css board属性来显示1个像素的线条,但是发现在移动设备上并不美观,参考淘宝.京东的触屏发现它们均是采 ...
- 关于MFC资源句柄、ID和对象
一.资源.句柄和ID 资源: MFC中的资源,如菜单.对话框.图标.工具条.对话框等,是windows创建的,并占用堆内存.windows在创建这些资源时候会给每个资源分配一个句柄,用来标记这些资源, ...
- QE名词解释以及相关文章链接
百科: http://baike.baidu.com/link?url=ho-aUG2rZwgjx75rwFu5b3XoQnsuJMj9GrJEuaZxnakg19ofO13mrXCMi9_JZ_VY ...
- JS数组的sort排序
数组sort方法排序var aa=[6,2,1,5]//默认是从小到大排序aa.sort()[1, 2, 5, 6] //下面也是从小到大排序aa.sort(function(a,b){return ...
- docker 容器内服务自启动
centos6/7 有区别先说6 centos6: 方式一:rc.local + 容器内的启动脚本 1.chkconfig docker on #docker开机自启动2.[root@master y ...
- Centos6.5 安装pip
1.下载 sudo wget https://bootstrap.pypa.io/get-pip.py --no-check-certificate 2.安装 python get-pip.py 参 ...
- Linux IO实时监控iostat命令详解(转)
简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...