您的位置:首页 > 运维架构

最小堆的维护,POJ(2051)

2016-05-11 20:18 447 查看
题目链接:http://poj.org/problem?id=2051

///维持最小堆(优先队列)POJ2051
#include <iostream>
#include <string>

using namespace std;

struct Node {
int Now;    ///出堆的时间
int id;
int p;  ///时间间隔
};

Node node [3001];
int K;  ///输出个数

void down (Node H[],int s,int m) {
///向下调整,s是要调整的编号,m是堆的size
Node rc=H[s];
for(int j=s*2; j<=m; j*=2) {
if(j<m) {
if(H[j].Now>H[j+1].Now) {   ///两个子节点中找到那个较小者
j++;
} else {
///如果相等,比较ID
if(H[j].Now==H[j+1].Now&&(H[j].id>H[j+1].id))
j++;
}
}
if(rc.Now<H[j].Now||(rc.Now==H[j].Now&&rc.id<H[j].id))
break;
H[s]=H[j];  ///更新子节点
s=j;
}
H[s]=rc;    ///最后交换的子节点换上rc
}

///建立一个最小堆
void MakeMinHeap(Node H[],int length) {
for(int i=length/2; i>0; --i)
down(H,i,length);
}

int main() {
string str;
int i=1;
cin>>str;
while(str.compare("#")!=0) {
cin>>node[i].id>>node[i].p;
node[i].Now=node[i].p;
i++;
cin>>str;
}
int len=i-1;
cin>>K;
MakeMinHeap(node,len);
for(int i=1; i<=K; i++) {
cout<<node[1].id<<endl;
node[1].Now+=node[1].p;
down(node,1,len);   ///修改顶点后再次调整最小堆
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: