hdu2544(自己实现优先队列)
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(自己实现优先队列)的更多相关文章
- 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)
再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个 ...
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:优先队列 基于list实现(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...
- python优先队列,队列和栈
打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...
- 数据结构作业——Sanji(优先队列)
山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...
- Java优先队列
按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...
- 优先队列实现Huffman编码
首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...
- “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)
题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
随机推荐
- Swift 可展开可收缩的表视图
主要学习与运行效果 在本节的内容中,我们将通过一个具体实例的实现过程,详细讲解在表视图当中,如何创建一个可展开可收缩的表视图.为了让读者有着更为直观的印象,我们将通过模仿QQ好友列表来实现这个效果. ...
- Swift - 使用arc4random()、arc4random_uniform()取得随机数
arc4random()这个全局函数会生成9位数的随机整数 1,下面是使用arc4random函数求一个1~100的随机数(包括1和100) 1 var temp:Int = Int(arc4ra ...
- 第四章 Spring与JDBC的整合
这里选择的是mysql数据库. 4.1引入aop.tx的命名空间 为了事务配置的需要,我们引入aop.tx的命名空间 <?xml version="1.0" encoding ...
- 八皇后问题详细分析与解答(递归法解答,c#语言描述)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或 ...
- 设计模式(4)-对象创建型模式-Prototype模式
1.对象创建型模式 1.4 Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...
- [Android学习笔记]捕获物理回退事件
物理回退按钮默认情况下是finish当前activity,返回上一个activity 当需要获取物理回退按钮的相应事件时候,可以这么做 步骤如下: 1.override当前activity的onKey ...
- 11.4.2 排序或合并文件(sort命令) - 51CTO.COM
11.4.2 排序或合并文件(sort命令) - 51CTO.COM 11.4.2 排序或合并文件(sort命令) 2010-03-12 14:37 陆松年 电子工业出版社 我要评论(0) 字号:T ...
- Raphaël 中文帮助文档(API)
http://html5css3webapp.com/raphaelApi.htm
- cocos2d 走动椭圆
1.效果图 艺术与规划说他想与我合作在全国率先主角光环加,椭圆形走动. cocos2d自带没有,參考网上的写了一个. 2.椭圆数学知识 有关椭圆的数学知识我已经忘光了.网上找了点资料: a是椭圆的长半 ...
- 初步C++运算符重载学习笔记<3> 增量递减运算符重载
初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数 增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...