hdu2544  dij水题,用来测试自己实现优先队列对不对

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
typedef long long LL;
const int INF = << ;
const int N = + ;
int len;
struct node
{
int v, cost;
int next;
}g[+];
int head[N], e;
int dist[N];
bool vis[N];
void init(int n)
{
for (int i = ; i <= n; ++i)
head[i] = -;
e = ;
}
void addEdge(int u, int v, int c)
{
g[e].v = v;
g[e].cost = c;
g[e].next = head[u];
head[u] = e++;
}
struct node2
{
int v, dist;
bool operator<(const node2&rhs)const
{
return dist > rhs.dist;
}
}q[]; void push(node2 tmp)//在队尾加入一个元素,只要调整到父亲结点不大于自己即可
{
int adjustIndex = ++len;
for (int i = adjustIndex / ; i >= ; i /= )
{
if (q[i].dist < tmp.dist)
break;
q[adjustIndex] = q[i];
adjustIndex = i;
}
q[adjustIndex] = tmp;
} node2 get()
{
node2 ret = q[];//得到队首元素
node2 tmp = q[len--];//将队尾元素放到队首
int adjustIndex = ;
//调整成一个小顶堆
for (int i = adjustIndex * ; i <= len; i = i * )
{
if (i < len && q[i].dist > q[i + ].dist)
i++;
if (tmp.dist < q[i].dist)
break;
q[adjustIndex] = q[i];
adjustIndex = i;
}
q[adjustIndex] = tmp;
return ret;
} void dij(int n)
{
//priority_queue<node2> q;
for (int i = ; i <= n; ++i)
{
dist[i] = INF;
vis[i] = false;
}
len = ;
dist[] = ;
node2 cur, tmp;
cur.v = ;
cur.dist = ;
//q.push(cur);
push(cur);
while (len!=)
{
cur = get();
//cur = q.top();
//q.pop();
int x = cur.v;
if (vis[x]) continue;
vis[x] = true;
for (int i = head[x]; i != -; i = g[i].next)
{
int v = g[i].v;
tmp.v = v;
if (dist[v] > dist[x] + g[i].cost)
{
tmp.dist = dist[v] = dist[x] + g[i].cost;
//q.push(tmp);
push(tmp);
}
} }
}
int main()
{
int n, m, a, b, c, i;
while (scanf("%d%d", &n, &m) ,n)
{
init(n);
for (i = ; i < m; ++i)
{
scanf("%d%d%d", &a, &b, &c);
addEdge(a, b, c);
addEdge(b, a, c);
}
dij(n);
printf("%d\n", dist[n]);
}
}

hdu2544(自己实现优先队列)的更多相关文章

  1. 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)

    再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个 ...

  2. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  3. 数据结构:优先队列 基于list实现(python版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...

  4. python优先队列,队列和栈

    打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...

  5. 数据结构作业——Sanji(优先队列)

    山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...

  6. Java优先队列

    按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...

  7. 优先队列实现Huffman编码

    首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...

  8. “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)

    题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...

  9. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

随机推荐

  1. perl 异步请求和JS对比

    perl 异步和js对比: /js************** $(function(){ function isPhone(str){ var regex = /[0-9]{11,11}/; ret ...

  2. POJ 2112 Optimal Milking【网络流+二分+最短路】

    求使所有牛都可以被挤牛奶的条件下牛走的最长距离. Floyd求出两两节点之间的最短路,然后二分距离. 构图: 将每一个milking machine与源点连接,边权为最大值m,每个cow与汇点连接,边 ...

  3. poj 3623 Best Cow Line, Gold

    题目不算难,但是不认真想的话很容易wa,我就是wa了多次才意识到自己想法存在的缺陷. 相同的时候往后找知道出现不相同时,只能判断出当前字符的优先顺序. 这个题目如果朴素的按照这种方法做的话复杂度其实是 ...

  4. 【从cocos2d-x学习设计模式】第一阶段:辛格尔顿

    设计模式,它总结了前辈在许多方案重用代码.它是一个想法. 因为我们爱cocos2d-x,然后我们从去cocos2d-x在设计模式中,右一起学习!本篇解释未来辛格尔顿. 提cocos2d-x中间Dire ...

  5. Swift - 工具条(UIToolbar)的用法

    1,UIBarButtonItem是工具条按钮,有如下5种init初始化方法: (1)初始化为普通图片按钮 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 1 ...

  6. jquery 拓展方法

    摘抄自(http://hi.baidu.com/jjjvzugcpmcdmor/item/0e32a89c36a18544f04215d7) $.fn是指jquery的命名空间,加上fn上的方法及属性 ...

  7. java输出换行的标准姿势"line.separator"

    java中写.txt文件,实现换行的几种方法: 1.使用java中的转义符"\r\n": windows下的文本文件换行符:\r\n linux/unix下的文本文件换行符:\r ...

  8. Linux Socket编程注意事项

    Socket API 是网络应用程序开发中实际应用的标准 API.虽然该 API 简单.可是开发新手可能会经历一些常见的问题.本文识别一些最常见的隐患并向您显示怎样避免它们. 隐患 1.忽略返回状态 ...

  9. hibernate学习(一)

    一.准备工作:导入jar包 1.hibernate的jar包 位置: hibernate-release-5.0.2.Final\hibernate-release-5.0.2.Final\lib\r ...

  10. thinkphp3.2入口文件

    原文:thinkphp3.2入口文件 <?php define('DIR_SECURE_FILENAME', 'default.html');//错误页面 define('APP_PATH',' ...