堆模板

来源:互联网 发布:手机淘宝改支付宝绑定 编辑:程序博客网 时间:2024/04/29 04:47
//维持最小堆//调整void down(int p){    int q=p*2;    a=heap[p];    while(q<=hlength)    {        if(q<hlenth&&heap[q]>heap[q+1])//寻找当前子节点中较小的那个        {            q++;        }        if(heap[q]>=a)//若较小的那个较大则结束            break;        else        {            heap[p]=heap[q];//交换位置            p=q;            q=p*2;        }    }    heap[p]=a;//安排原来的节点}//删除最小元素,并且返回其值int DelteMin(){    int r=heap[1];    heap[1]=heap[hlength-1];//将最后一个节点赋值给根节点    down(1);    return r;}//插入一个元素,先添加到末尾,在向上调整void up(int p){    int q=p/2;    a=heap[p];    while(q>=1&&a<heap[q])//当前的节点比父母值小则交换    {        heap[p]=heap[q];        p=q;        q=p/2;    }    heap[p]=a;}void insert(int a){    heap[++hlength]=a;    up(hlength);}//将x的优先级上升为Pvoid IncreaseKey(int p,int a){    //将p的优先级s上升为a    if(heap[p]<a)        return ;    heap[p]=a;    up(p);}//建堆void build(){    for(int i=hlength/2;i>0;i--)        down(i);}

poj2051
http://poj.org/problem?id=2051

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct node{    int now;    int perid;    int num;};node nodes[10009];int len;void down(int p){    node tt=nodes[p];    int q=p*2;    while(q<=len)    {        if(q<len&&nodes[q].now>nodes[q+1].now                ||q<len&&nodes[q].now==nodes[q+1].now&&nodes[q+1].num<nodes[q].num) q++;        if(tt.now<nodes[q].now||                tt.now==nodes[q].now&&nodes[q].num>tt.num) break;        nodes[p]=nodes[q];        p=q;        q=q<<1;    }    nodes[p]=tt;}void makeTree(){    for(int i=len/2; i>0; i--)        down(i);}int main(){    char s[30];    len=0;    while(~scanf("%s",s))    {        if(strcmp(s,"#")==0) break;        len++;        scanf("%d%d",&nodes[len].num,&nodes[len].perid);        nodes[len].now=nodes[len].perid;    }    int k;    scanf("%d",&k);    makeTree();    for(int i=0; i<k; i++)    {        printf("%d\n",nodes[1].num);        nodes[1].now+=nodes[1].perid;        down(1);    }    return 0;}
原创粉丝点击