poj 2051 - Argus(堆)

本文详细介绍了如何使用堆实现优先队列,并通过代码实例展示了小顶堆的建堆和调整过程。通过堆排序算法,实现了高效的数据排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前做过的题目,,,,优先队列的多路合并见刘汝佳厚书P188

最近正在学习堆,所以手工的用堆来实现了一把优先队列。

小顶堆

代码如下:

struct Node
{
    int id;
    int period;
    int time;
    bool operator < (const Node &tmp) const
    {
        return time<tmp.time||(time==tmp.time&&id<tmp.id);
    }
    Node& operator = (const Node &tmp)
    {
        this->id = tmp.id;
        this->period = tmp.period;
        this->time = tmp.time;
        return (*this);
    }
};
Node node[3005];
int len;

void down(int p)//向下调整
{
    int q;
    Node tmp = node[p];//保存当前节点的值
    for( q = p*2; q <= len; q *= 2)
    {
        if(q<len&&node[q+1]<node[q])//选择两个子节点中最小的一个
            q = q+1;
        if(tmp<node[q])//如果子节点比当前节点大就结束
            break;
        else//否则交换
        {
            node[p] = node[q];
            p = q;
        }
    }
    node[p] = tmp;//安排原来的节点
}
void build()//建堆算法
{
    for(int i = len/2; i > 0; --i)//从最后一个非终端节点开始
        down(i);
}
int main()
{
    char s[30];
    int cur = 1;
    while(scanf("%s", s) && s[0] != '#')
    {
        scanf("%d%d", &node[cur].id, &node[cur].period);
        node[cur].time = node[cur].period;
        ++cur;
    }

    len = cur-1;
    build();
    int k;
    scanf("%d", &k);
    while(k--)
    {
        printf("%d\n", node[1].id);
        node[1].time += node[1].period;//修改顶点后,再次调整小顶堆
        down(1);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值