颓废。。

 #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的更多相关文章

  1. 手写堆优化dijkstra

    \(dijkstra\) 算法的堆优化,时间复杂度为\(O(n+m)\log n\) 添加数组\(id[]\)记录某节点在堆中的位置,可以避免重复入堆从而减小常数 而这一方法需要依托手写堆 #incl ...

  2. spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111

    http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...

  3. Luogu [P1334] 瑞瑞的木板(手写堆)

    其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并 ...

  4. AC日记——手写堆ac合并果子(傻子)

    今天整理最近的考试题 发现一个东西叫做优先队列 priority_queue(说白了就是大根堆) 但是 我对堆的了解还是很少的 所以 我决定手写一个堆 于是我写了一个简单的堆 手写的堆说白了就是个二叉 ...

  5. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  6. [转载] 管Q某犇借的手写堆

    跟gxy大神还有yzh大神学了学手写的堆,应该比stl的优先队列快很多. 其实就是维护了一个二叉堆,写进结构体里,就没啥了... 据说达哥去年NOIP靠这个暴力多骗了分 合并果子... templat ...

  7. BZOJ 1975 魔法猪学院(A*+手写堆)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1941  Solved: 595 [Submit][Sta ...

  8. 手写堆_C++

    一般主程序中拿堆顶元素 x=h[]; h[]=h[top--]; down(); 在堆尾加入元素 h[++top]=x; up(top); 上浮下沉操作 inline void up(int x) { ...

  9. 堆优化Dijkstra算法

    但是,我们会发现刚刚讲的朴素Dijkstra算法(高情商:朴素 : 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间: 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新 ...

随机推荐

  1. type为number的input标签输入小数的方法

    纠结了一段时间都没找出方法,最后灵光一现想出这个方法,没想到测试下果然成功了! 看目前网上几乎很难找到相对应的解决方法,所以这里分享出来,如果有更佳方法欢迎提出. 方法如下: <input ty ...

  2. codeforces 622B B. The Time

    B. The Time time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  3. I.MX6 Android 永不休眠

    /************************************************************************* * I.MX6 Android 永不休眠 * 说明 ...

  4. kudu安装以及kudu的坑

    本文描述的是kudu在cloudera的安装. 首先cloudera 5.11.1版本尽管可以直接在add Services中看到kudu,但是其实并没有集成parcels,而且也不想kafka提示需 ...

  5. 2008上交:Day of Week

    题目描述: We now use the Gregorian style of dating in Russia. The leap years are years with number divis ...

  6. 二 Flask快速入门

    1: 外部可访问的服务器: 如果你运行了这个服务器,你会发现它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问.在调试模式下,用户可以在你的计算机上执行任意 Python 代码.因此,这个行 ...

  7. k8s 基础 问题

    vim /usr/lib/systemd/system/docker.service --insecure-registry registry.access.redhat.com \ ubelet.s ...

  8. SSDB VS redis

    现在有不少团队开始使用了一个新型高效的 NoSQL数据库 - SSDB,如 京东.唱吧 …… SSDB 官网的定义 一个高性能的支持丰富数据结构的 NoSQL 数据库,用于替代 Redis 官网 ht ...

  9. RN控件之View Text

    /** * 模仿美团首页部分 * */ 'use strict' import React,{ AppRegistry, Component, StyleSheet, Text, View, Imag ...

  10. nodejs PK php全方位比较PHP的Node.js的优缺点

    全方位比较PHP的Node.js的优缺点 http://www.techug.com/php-vs-node-js