hdu2544(自己实现优先队列)

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

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <algorithm>
  5 #include <iostream>
  6 #include <queue>
  7 #include <stack>
  8 #include <vector>
  9 #include <map>
 10 #include <set>
 11 #include <string>
 12 #include <math.h>
 13 using namespace std;
 14 #pragma warning(disable:4996)
 15 typedef long long LL;
 16 const int INF = 1 << 30;
 17 const int N = 1000 + 10;
 18 int len;
 19 struct node
 20 {
 21     int v, cost;
 22     int next;
 23 }g[10000+10];
 24 int head[N], e;
 25 int dist[N];
 26 bool vis[N];
 27 void init(int n)
 28 {
 29     for (int i = 1; i <= n; ++i)
 30         head[i] = -1;
 31     e = 0;
 32 }
 33 void addEdge(int u, int v, int c)
 34 {
 35     g[e].v = v;
 36     g[e].cost = c;
 37     g[e].next = head[u];
 38     head[u] = e++;
 39 }
 40 struct node2
 41 {
 42     int v, dist;
 43     bool operator<(const node2&rhs)const
 44     {
 45         return dist > rhs.dist;
 46     }
 47 }q[100000];
 48
 49
 50 void push(node2 tmp)//在队尾加入一个元素,只要调整到父亲结点不大于自己即可
 51 {
 52     int adjustIndex = ++len;
 53     for (int i = adjustIndex / 2; i >= 1; i /= 2)
 54     {
 55         if (q[i].dist < tmp.dist)
 56             break;
 57         q[adjustIndex] = q[i];
 58         adjustIndex = i;
 59     }
 60     q[adjustIndex] = tmp;
 61 }
 62
 63 node2 get()
 64 {
 65     node2 ret = q[1];//得到队首元素
 66     node2 tmp = q[len--];//将队尾元素放到队首
 67     int adjustIndex = 1;
 68     //调整成一个小顶堆
 69     for (int i = adjustIndex * 2; i <= len; i = i * 2)
 70     {
 71         if (i < len && q[i].dist > q[i + 1].dist)
 72             i++;
 73         if (tmp.dist < q[i].dist)
 74             break;
 75         q[adjustIndex] = q[i];
 76         adjustIndex = i;
 77     }
 78     q[adjustIndex] = tmp;
 79     return ret;
 80 }
 81
 82 void dij(int n)
 83 {
 84     //priority_queue<node2> q;
 85     for (int i = 1; i <= n; ++i)
 86     {
 87         dist[i] = INF;
 88         vis[i] = false;
 89     }
 90     len = 0;
 91     dist[1] = 0;
 92     node2 cur, tmp;
 93     cur.v = 1;
 94     cur.dist = 0;
 95     //q.push(cur);
 96     push(cur);
 97     while (len!=0)
 98     {
 99         cur = get();
100         //cur = q.top();
101         //q.pop();
102         int x = cur.v;
103         if (vis[x]) continue;
104         vis[x] = true;
105         for (int i = head[x]; i != -1; i = g[i].next)
106         {
107             int v = g[i].v;
108             tmp.v = v;
109             if (dist[v] > dist[x] + g[i].cost)
110             {
111                 tmp.dist = dist[v] = dist[x] + g[i].cost;
112                 //q.push(tmp);
113                 push(tmp);
114             }
115         }
116
117     }
118 }
119 int main()
120 {
121     int n, m, a, b, c, i;
122     while (scanf("%d%d", &n, &m) ,n)
123     {
124         init(n);
125         for (i = 0; i < m; ++i)
126         {
127             scanf("%d%d%d", &a, &b, &c);
128             addEdge(a, b, c);
129             addEdge(b, a, c);
130         }
131         dij(n);
132         printf("%d\n", dist[n]);
133     }
134 }

时间: 2024-08-08 05:22:53

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

hdu2544 最短路(dijkstra/优先队列)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 39750    Accepted Submission(s): 17334 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找

ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28761    Accepted Submissio

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

再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个是之前就定义了图的大小了,再下面使用的时候就不用对图的大小进行申请了, 但是因为是直接申请了大小 要对图进行初始化,因此可能在某些题目中这样使用的话会超时 (2)vector< vector<Node> > G; 这个是未定义大小,但是在使用之前要对其的大小内存进行申请. G.resi

51nod1428(优先队列)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 题意:中文题诶- 思路:贪心 问最少要多少教室就是求最多有多少个时间段产生了交集咯.我们先用结构体存储区间并将其按照左端点升序排列,若左端点相同则按右端点升序排列. 接下来遍历所有区间,并维护一个优先队列,其中存储区间右端点值.对于当前区间,我们将优先队列中所有比当前区间左端点小的元素删除(因为其所在区间不会与当前区间相交嘛),然后再将当前区间的右端点加

优先队列实现哈弗曼最小权值

建立哈弗曼树要求我们每次都选频率权值最小的点构成节点,即权值小的点在树的深处,权值大的点在树的浅处,根据节点选择的特点,我们可以把节点的值放在优先队列中,包括新形成的节点. 我们先定义优先队列的优先级别. 1 struct cmp 2 { 3 bool operator()(const int &a,const int &b) 4 { 5 return a>b; 6 } 7 };//最小值优先出队 然后就是实现的整个程序. #include<stdio.h> #inclu

NYOJ 284 坦克大战 &amp;&amp; POJ 2312 Battle City (广搜+优先队列)

链接:click here~~ 题意: 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that consists of empty space

hdu 4006 The kth great number(优先队列)

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 6982    Accepted Submission(s): 2837 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

优先队列(堆)

一.优先队列的一些简单的实现: 1. 使用一个简单的链表在表头以O(1) 执行插入操作,并遍历该链表以删除最小元,这需要O(N) 的时间. 2. 始终让表保持有序状态:这使得插入代价高昂(O(N)), 而删除代价低廉(O(1)).基于删除最小元的操作从不多于插入操作的事实,因此,前者是更好地想法. 3. 使用二叉查找树,它对这两种操作的平均运行时间是O(logN).尽管插入是随机的,而删除不是,但这个结论还是成立的.由于删除的唯一元素是最小元.反复除去左子树中的节点似乎损害树的平衡,使得右子树加

优先队列比较符重载

#include <iostream> #include <queue> using namespace std; struct Node{ int x, y; friend bool operator<(Node a, Node b){ return a.x > b.x; //x最小的节点在队首 } }; int main(){ priority_queue<Node> PQ; Node temp = {2, 3}; PQ.push(temp); temp