zoukankan      html  css  js  c++  java
  • 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
    ", dist[n]);
    133     }
    134 }
    View Code
  • 相关阅读:
    __getattribute__()、__getattr__()、__setattr__()、__delattr__()
    Python: Catch multiple exceptions in one line (except block)
    Python中的__new__和__init__
    使用sphinx生成Python文档
    Windows下干活儿辅助软件
    Python的Descriptor和Property混用
    Solved: Qt Library LNK 2001 staticMetaObject error
    OS sysbench压力测试
    Oracle 数据库 sysbench 压力测试
    MySQL 数据库 Sysbench压力测试
  • 原文地址:https://www.cnblogs.com/justPassBy/p/4458198.html
Copyright © 2011-2022 走看看