zoukankan      html  css  js  c++  java
  • pta Percolate Up and Down(最小堆的插入维护和删除维护)

    Write the routines to do a “percolate up” and a “percolate down” in a binary min-heap.
    Format of functions:

    void PercolateUp( int p, PriorityQueue H );
    void PercolateDown( int p, PriorityQueue H );

    where int p is the position of the element, and PriorityQueue is defined as the following:

    typedef struct HeapStruct *PriorityQueue;
    struct HeapStruct {
        ElementType  *Elements;
        int Capacity;
        int Size;
    };

    Sample program of judge:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElementType;
    #define MinData -1
    
    typedef struct HeapStruct *PriorityQueue;
    struct HeapStruct {
        ElementType  *Elements;
        int Capacity;
        int Size;
    };
    
    PriorityQueue Initialize( int MaxElements ); /* details omitted */
    
    void PercolateUp( int p, PriorityQueue H );
    void PercolateDown( int p, PriorityQueue H );
    
    void Insert( ElementType X, PriorityQueue H ) 
    {
        int p = ++H->Size;
        H->Elements[p] = X;
        PercolateUp( p, H );
    }
    
    ElementType DeleteMin( PriorityQueue H ) 
    { 
        ElementType MinElement; 
        MinElement = H->Elements[1];
        H->Elements[1] = H->Elements[H->Size--];
        PercolateDown( 1, H );
        return MinElement; 
    }
    
    int main()
    {
        int n, i, op, X;
        PriorityQueue H;
    
        scanf("%d", &n);
        H = Initialize(n);
        for ( i=0; i<n; i++ ) {
            scanf("%d", &op);
            switch( op ) {
            case 1:
                scanf("%d", &X);
                Insert(X, H);
                break;
            case 0:
                printf("%d ", DeleteMin(H));
                break;
            }
        }
        printf("
    Inside H:");
        for ( i=1; i<=H->Size; i++ )
            printf(" %d", H->Elements[i]);
        return 0;
    }
    
    /* Your function will be put here */

    Sample Input:

    9
    1 10
    1 5
    1 2
    0
    1 9
    1 1
    1 4
    0
    0

    Sample Output:

    2 1 4 
    Inside H: 5 10 9

    思路:
    题目让实现最小堆的插入维护和删除维护。只要记住最小的在上面就行。
    另外要注意down的时候可能只有一个儿子。

    代码:

    void PercolateDown( int p, PriorityQueue H )
    {   
        if(p<<1 > H->Size)return;
    
        int replace;
        if(p<<1+1 <= H->Size)replace = (H->Elements[p<<1] < H->Elements[p<<1+1] ? p<<1 : p<<1+1);
        else replace = p<<1;
        if(H->Elements[replace] < H->Elements[p])
        {
            int mid = H->Elements[replace];
            H->Elements[replace] = H->Elements[p];
            H->Elements[p] = mid;
            PercolateDown( replace, H );
        }
    }
    
    void PercolateUp( int p, PriorityQueue H )
    {
        if(p == 1)return;
    
        if(p&1)
        {
            if(H->Elements[(p-1)>>1] > H->Elements[p])
            {
                int mid = H->Elements[(p-1)>>1];
                H->Elements[(p-1)>>1] = H->Elements[p];
                H->Elements[p] = mid;
                PercolateUp( (p-1)>>1, H );
            }
        }
        else
        {
            if(H->Elements[p>>1] > H->Elements[p])
            {
                int mid = H->Elements[p>>1];
                H->Elements[p>>1] = H->Elements[p];
                H->Elements[p] = mid;
                PercolateUp( p>>1, H );
            }
        }
    }
    
  • 相关阅读:
    四十八.监控概述 、 Zabbix基础 、 Zabbix监控服务
    123D
    bzoj3879
    bzoj1699
    LA6878
    uoj#149
    687C
    codeforces round #424 div2
    803E
    713C
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514204.html
Copyright © 2011-2022 走看看