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