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. Multiplepack coming~^.^

    多重背包: 基本思路: 先来看一个引例:有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量, ...

  2. WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)

    #define WM_ERASEBKGND                   0x0014 Parameters wParam A handle to the device context. //  ...

  3. vc2008构建和使用libcurl静态库

    1>下载CURL源代码curl-7.26.0.zip 2>用VC2008/2005打开工程curl-7.26.0\lib\libcurl.vcproj,转换下工程并构建,可以直接编译成功! ...

  4. MySQL查看连接数

    MySQL查看连接数 1.查看部分连接数(数目较多时) show processlist; 2.查看所有连接数(数目较多时) show full processlist;

  5. java学习笔记04--数组

    java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...

  6. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s)

    问题: No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv ...

  7. 学习日记之命令模式和Effective C++

    命令模式(Command): 讲一个请求封装为一个对象.从而使你可用不同的请求对客户进行參数化.对请求队列或记录请求日志.以及支持可撤销的操作. 命令模式长处: (1),它能较easy地设计一个命令队 ...

  8. Codeforce 57C Array

    C. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  9. HDU1789Doing Homework again(贪婪)

    HDU1789Doing Homework again(贪心) 题目链接 题目大意:给你n们作业的最后期限和过了这个期限没做须要扣的分数.问如何安排能够使得扣分最少. 解题思路:贪心,将扣分多的作业排 ...

  10. EXPORT_SYMBOL解析

    一般我们编写C程序时,要调用某个文件中的函数,需要在本文件中包含声明有被调用函数的头文件,然后编译连接后,方能找到调用函数.对于模块依赖的情况,不能简单的使用上面的方法,内核提供了一个机制,就是EXP ...