【贪心】区间图着色 Interval-graph Coloring Problem

来源:互联网 发布:java中线程同步的机制 编辑:程序博客网 时间:2024/05/19 06:47

http://blog.sina.com.cn/s/blog_51cea4040100gpw6.html

算法导论 练习 16.1-3

假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有的活动。请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室。

(这个问题也被称为区间图着色(interval-graph coloring)问题。我们可作出一个区间图,其顶点为已知的活动,其边连接着不兼容的活动。为使任两个相邻结点的颜色均不相同,所需的最少颜色数对应于找出调度给定的所有活动所需的最少教室数。)

 

方法一:纯模拟。

贪心策略:对于活动的开始时间和结束时间点进行排序。维护两个盒子,busy_classroom_num、free_classroom_num。扫描排序的时间t,若t为一个活动的开始时间,我们从free_classroom_num--,busy_classroom_num++。如果,在free_classroom_num--之前,free_classroom_num已经为0,则新生成一个教室,直接busy_classroom_num++。若t为一个活动的结束时间,我们从busy_classroom_num--,free_classroom_num++。时间扫描完毕,free_classroom_num为最少的教室数。

简单证明:我们关心的并不是具体哪个教室去搞哪个活动,而是,在这个活动的时间段有教室让他搞。所以,只需要纯模拟就可搞定。

 

方法二:完全贪心

贪心策略:按照活动的结束时间进行排序。然后,每次选取当前可兼容并且结束时间最小的一个活动,选到选不动为止,将他们放到一个教室搞。将刚才的活动标记后,再以上面的方法,找到第二个集合放到另外一个教室。直到活动都标记完。

简单证明:抓住重点,我们不关心具体哪个教室去搞哪个活动。那么会不会出现一教室不搞这个活动,留给二,这样,二教室提前结束活动可以多搞些活动?这样的想法其实没必要,因为,一搞了留给二的那个活动就可以接着搞二还可以搞的活动,那么二虽然搞得少,但是,那些活动一教室已经帮他搞了。中心:只要活动有教室搞就行,不管哪个教室。

 

关于题目描述括号里那段。它把这题抽象出了一个模型。连边代表这两个活动有冲突。解决方法就是上文所述。

现在,扩展一下,我们反起来想,如果给出一个图,要求涂色,使得任意边所连接的两点颜色不同,问至少需要多少种颜色来涂。这样的题,我们可不可以怎么转换,然后,用上述的贪心方法?

ccy的答案是没有。

上可以用贪心来做满足了两个条件:1、冲突,2、结束时间有序。

而扩展这题,我们连接的边为冲突满足了条件1,但是,条件2并不存在,所以,我们需要去构造。

如下图:

http://photo.blog.sina.com.cn/showpic.html#blogid=51cea4040100gpw6&url=http://static14.photo.sina.com.cn/orignal/51cea404x7b4a340223fd&690

红圈里的点,无论我们怎么编号,始终不满足活动实际的冲突。

如上面的第一种编号,既然1和7都有冲突,难道5、6和7会没有冲突吗?所以,该标号法wrong掉。

第二种,4和6、7有冲突,难道5会和6、7没冲突吗?ok,继续wrong掉。

于是乎,我们轻易的得出结论,任意的一个图,是无法转换成活动调度的情景的。虽然,活动调度可以转换成这么一个图。

 

PS:这是ccy的个人见解,如果,有不同的想法,欢迎讨论。O(∩_∩)O谢谢……

原创粉丝点击