• 14.模拟堆


     

    主要用在图论的Dijkstra算法

    首先需要知道第k个插入的点是堆里面的哪个点

    还需要知道堆里面的某个点是第几个插入的点

     第j个插入的点是堆里面的k

    堆里面的k是第j个插入的点

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 100010;
     4 int h[N], se;
     5 int ph[N], hp[N];
     6 //ph[k]存储第k个插入的数在堆里的下标
     7 //hp[k]堆里面的点是第几个插入的点 
     8 void heap_swap(int a, int b) {
     9     swap(ph[hp[a]], ph[hp[b]]);
    10     swap(hp[a], hp[b]); 
    11     swap(h[a], h[b]); //交换两个值
    12 } 
    13 void down(int u) {
    14     int t = u;
    15     if (u * 2 <= se && h[u * 2] < h[t]) {
    16         t = u * 2;
    17     }
    18     if (u * 2 + 1 <= se && h[u * 2 + 1] < h[t]) {
    19         t = u * 2 + 1;
    20     }
    21     if (u != t) {
    22         heap_swap(u, t);
    23         down(t);
    24     }
    25 }
    26 void up(int u) {
    27     while (u / 2 && h[u / 2] > h[u]) {
    28         heap_swap(u / 2, u);
    29         u /= 2;
    30     }
    31 }
    32 int main() {
    33     int n;
    34     cin >> n;
    35     int m = 0; //表示是当前第几个插入的数
    36     while (n--) {
    37         string s;
    38         int k, x;
    39         cin >> s;
    40         if (s == "I") {
    41             cin >> x;
    42             se++;
    43             m++;
    44             ph[m] = se; //插入新的数,放在末尾
    45             hp[se] = m;
    46             h[se] = x;
    47             up(se);
    48         } else if (s == "PM") {
    49             cout << h[1] << endl;
    50         } else if (s == "DM") {
    51             heap_swap(1, se);
    52             se--;
    53             down(1);
    54         } else if (s == "D") {
    55             cin >> k;
    56             k = ph[k]; //让k等于第k个插入的数在堆里面的位置
    57             heap_swap(k, se);
    58             se--;
    59             down(k);
    60             up(k);
    61         } else {
    62             cin >> k >> x;
    63             k = ph[k];
    64             h[k] = x;
    65             down(k);
    66             up(k);
    67         }
    68     }
    69     return 0;
    70 } 
  • 相关阅读:
    Python之控制台进度条实现
    Flask之接入自定义的图片验证码
    CISSP学习笔记——域1安全与风险管理
    Nginx+Keepalived实现四层及七层负载均衡
    【葵花宝典】kolla部署OpenStack-AllinOne
    【葵花宝典】All-in-One模式安装KubeSphere
    【易筋经】Llinux服务器初始化及常用命令大全
    python去除文件中重复的行
    PowerDesigner批量增加字段
    Docker使用
  • 原文地址:https://www.cnblogs.com/fx1998/p/13303524.html
Copyright © 2020-2023  润新知