poj 2051 - Argus(堆)

以前做过的题目,,,,优先队列的多路合并见刘汝佳厚书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;
}


你可能感兴趣的:(poj 2051 - Argus(堆))