`
coolsooner
  • 浏览: 1313262 次
文章分类
社区版块
存档分类
最新评论

POJ 3687 Labeling Balls 拓扑排序

 
阅读更多

这道题是拓扑排序的一个变种, 题目的要求是编号最小的点尽量在前面,而且在满足编号1尽量靠前的条件下,编号2要尽量靠前,在满足前两个条件下,编号3尽量靠前,依次类推。

首先,传统的拓扑排序就无法解决这个问题了,我们只能做到每次尽可能把编号小的点放到前面,但不能保证就是编号1尽量靠前,然后编号2.3等等均尽量靠前。这时就要转变一个方法了。那就是逆序求拓扑序列。每次找到最大的拿出来放到序列的尾部,然后就能达到题目的要求了。

1. 把所有出度为 0 的节点放进优先队列 PQ //这里的优先队列是以数值大的优先
2. WHILE: PQ 不是空队列
3. 从 PQ 中取出编号最大的元素 a,把 a 添加到答案的头部。
4. FOR:所有指向 a 的边 b → a
5. 把 b 的出度减 1。如果 b 的出度变为 0,则把 b 放进优先队列 PQ。

需要注意的是,最后求出的序列只是小球的编号而已,而题目要求是编号升序输出小球的重量。这一点样例很阴险,直接给掩盖过去了。一般不注意就会倒霉在这里。

另外还需要判重,还会出现1,1这种数据,都要考虑到。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics