堆优化版本自己写了个堆。。。貌似实现错了(换成stl就能过。。)求大佬指点
查看原帖
堆优化版本自己写了个堆。。。貌似实现错了(换成stl就能过。。)求大佬指点
227434
BNDShly楼主2020/11/30 16:53
struct myPair{
    long long dis;
    int pos;
    myPair(int d = 0,int p = 1):dis(d),pos(p){}
    bool operator<(const myPair& x){
        return x.dis < dis;
    }
};
struct Heap{
    int size_;
    int cap;
    myPair* arr;
    Heap(int n){
        size_ = 0;
        cap = N;
        arr = new myPair[N + 1];
    }
    ~Heap (){}
    void push(myPair val){
    if( size_ >= cap) {
        myPair* temp = new myPair [cap << 1];
        for(int i = 1; i <= cap; i++) {
            temp[i] = arr[i];
        }
        arr=temp;
        cap<<=1;
    }
    size_ ++;
    arr[size_] = val;
    up(size_);
    }

    myPair pop(){
        myPair ans = arr[1];
        std::swap(arr[1],arr[size_--]);
        down(1);
        return ans;
    }
    void up(int n){
        while( n > 1 && arr[n] < arr[n>>1] ){//如果arr[n]比父亲节点的优先级大,将其上浮
        std::swap(arr[n],arr[n>>1]);
        n >>= 1;
    }

    }
    void down(int n ){
        while(n*2 <= size_){
        int k = 2*n;
        if(k < size_ && arr[k+1]<arr[k]) k++;//选出左右孩子中优先级更高的那个
        if(arr[k]<arr[n]){
            std::swap(arr[n],arr[k]);
            n = k;
        }
        else break;
    }
    }
    int size(){
        return size_;
    }
    bool empty(){
        return size_ == 0;
    }
    myPair top(){
        return arr[1];
    }
};
2020/11/30 16:53
加载中...