区间图着色问题

这是算法导论贪心算法一章的一个习题:

题目描述:假定有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行。我们希望使用最少的教室完成所有的活动。设计一个高效的贪心算法求每个活动应该在哪个教室进行。(这个问题称为区间图着色问题(interval-graph color problem)。我们可以构建一个区间图,顶点表示给定的活动,边连接不兼容的活动。要求用最少的颜色对顶点进行着色,使得所有相邻顶点颜色均不相同------这与使用最少的教室完成所有的活动的问题是对应的。)

贪心算法(这个被验证没有得出最小值):   设n个活动的集合为S。(对这n个活动按照结束时间排序)对第一个教室,找出最大兼容活动数量的集合S1.对第二个教室,从S-S1中,找出最大兼容活动数量的集合S2....依次类推。直到S-S1-S2-... == 0为止。这种贪心的时间复杂度为O(n*n).但是不能得到最小值。例如:[1,4), [2,5), [6,7), [4,8).按照这种方法,第一个教室可以进行的活动为[1,4)、[6,7);第二个教室是[2,5);第三个教室是[4,8).需要至少3个教室。但是可以这样:[1,4),[4,8)为一组,[2,5),[6,7)为一组。这样只需要2个教室。

另外一种方法:对n个活动的开始和结束时间进行排序。(相当于对2*n个元素进行排序)。然后设置两个链表free_list和busy_list。对排好序的2*n个元素进行扫描.若是开始时间,就将free_list中的房间加入busy_list中(如果free_list也为空,那就新建一个并加入busy_list中)。若是结束时间,就将busy_list中相应的房间拿出来放入free_list中。在此过程中busy_list中最多的房间数,即为所求的最小值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值