颓废。。

 #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. Python基础-修改excel中内容

    from xlutils.copy import copy import xlrd import os #1.打一要修改的excel #2.再打开另一个excel #3.把第一个excel里面修改东西 ...

  2. Python基础-处理json函数

    #json是一种通用的数据类型,所有的语言都认识#json是一个字符串,json串里面都得是双引号,主要是这四个函数 #dump#dumps#load#loads import jsonnames = ...

  3. Saiku_学习_02_Schema Workbench 开发mdx和模式文件

    一.前言 saiku的查询都是通过cube来进行的.因此每当我们要进行一次多维度查询时,都要先修改xml.上传.重启才能生效,不仅效率低,还不利于学习和理解MDX和模式文件. 通过 workbench ...

  4. codeforces 680D D. Bear and Tower of Cubes(dfs+贪心)

    题目链接: D. Bear and Tower of Cubes time limit per test 2 seconds memory limit per test 256 megabytes i ...

  5. Java 关于创建String对象过程的内存分配

    一.String s = "abc"  和 String s = new String("abc") 的区别 1.String s = "abc&qu ...

  6. linux命令学习笔记(22):find 命令的参数详解

    find一些常用参数的一些常用实例和一些具体用法和注意事项. .使用name选项: 文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用. 可以使用某种文件名 模式来匹配文 ...

  7. Android DOM解析XML方法及优化

    在Android应用开发中,我们常常要在应用启动后从服务器下载一些配置文件,这些配置文件包含一些项目中可能用到的资源,这些文件很多情况下是XML文件,这时就要将XML下载到文件中保存,之后再解析XML ...

  8. 使用UIBezierPath添加投影效果

                             代码: ViewController.h #import <UIKit/UIKit.h> @interface ViewControlle ...

  9. Oracle 12c 多租户 手工创建 pdb 与 手工删除 pdb

    实验环境: SQL> select * from v$version;BANNER                                                         ...

  10. html之canvas

    canvas代码片段: <canvas id="testCanvas" width="400" height="150" style= ...