区间图着色问题(贪心算法的解法)

问题描述:假设要用很多个教室对一组活动进行调度。我们希望使用尽可能少的教室来调度所有活动。请给出一个算法,来确定哪一个活动使用哪一间教室。这个问题也被称为区间图着色问题,即相容的活动着同色,不相容的着不同颜色,使得所用颜色数最少。

解法思想:

其实我们知道,对于单个教室我们可以用贪心算法进行求解,但是对于这个区间图的问题,我们采用的方法是多次的贪心。其实你想想看,你无非就是要使那些活动

全部被安排完吧,当然这样安排的方法很多,如何使得安排后的教室最小呢????

这明显也是个贪心的问题。聪明的人很快地想到,是不是可以多次的贪心呢?也就是说我对这些活动作一个标记,开始全部标记为”未安排“,第一次的时候就采用贪心算

法尽可能地用一间教室安排尽可能多的活动进去,然后将安排过的活动标记为”己安排“。然后对剩下的活动再进行用同样的贪心算法进行安排。

源代码

  1. #ifndef INTERVAL_GRAPH_COLORING_H
  2. #define INTERVAL_GRAPH_COLORING_H
  3. struct Activity{
  4. int startTime;
  5. int endTime;
  6. bool isArranged; //标记是否己被安排过
  7. };
  8. int greedyCore(Activity *activityArr,int Length);
  9. int intervalGraphColoringRoomNumber(int *startTime,int *endTime,int Length){
  10. Activity *activityArr=new Activity[Length-1];
  11. for(int i=0;i<Length; i++){//初使化活动
  12. activityArr[i].startTime=startTime[i];
  13. activityArr[i].endTime=endTime[i];
  14. activityArr[i].isArranged=false;
  15. }
  16. int usedActivity=0; //己安排过的活动
  17. int roomArrangedCount=0; //教室的计数
  18. while(usedActivity<Length-1){//不停地贪心选择活动,直到所有的活动己安排完。
  19. usedActivity+=greedyCore(activityArr,Length);
  20. roomArrangedCount++;
  21. }
  22. return roomArrangedCount;
  23. }
  24. //贪心算法的核心,返回本次贪心算法所安排的活动数。
  25. int greedyCore(Activity *activityArr,int Length){
  26. int firstunusedActivity=0;
  27. for(int i=0;i<Length-1; i++){
  28. if(!activityArr[i].isArranged){
  29. firstunusedActivity=i;
  30. break;
  31. }
  32. }
  33. int lastArrangedActivity=firstunusedActivity;
  34. int arrangedActiveityCount=1;
  35. for(int i=firstunusedActivity+1;i<Length;i++){
  36. if(!activityArr[i].isArranged){
  37. if(activityArr[i].startTime>=activityArr[lastArrangedActivity].endTime){
  38. activityArr[i].isArranged=true;
  39. arrangedActiveityCount++;
  40. lastArrangedActivity=i;
  41. }
  42. }
  43. }
  44. return arrangedActiveityCount;
  45. }
  46. #endif

测试代码

  1. #include"intervalGraphColoring.h"
  2. int main(){
  3. int start_time[11]={1,3,0,5,3,5,6,8,8,2,12};
  4. int end_time[11]={4,5,6,7,9,9,10,11,12,14,16};
  5. std::cout<<intervalGraphColoringRoomNumber(start_time,end_time,11);
  6. }

来自为知笔记(Wiz)

时间: 2024-10-14 09:10:25

区间图着色问题(贪心算法的解法)的相关文章

2、区间图着色问题(多个教室的活动安排)

算法导论 16.1-4题(多个教室活动选择的问题): CLRS 16.1-3 假设要用很多个教室对一组活动进行调度.我们希望使用尽可能少的教室来调度所有的活动.请给出一个有效的贪心算法,来确定哪一个活动应使用哪一个教室.来源: <算法导论16.1-3 区间图着色(interval-graph coloring)问题(贪心算法)> http://blog.csdn.net/heyongluoyao8/article/details/6934198(区间图着色贪心算法C++实现) 解决方法一: 1

零基础学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅.贪心算法的定义:贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关.解题的一般步骤是:1.建立数学模型来描述问题:2.把求解的问题分成若干个子问题:3.对每一子问题求解,得到子问题的局部最优解:4.把子问题的局部最优

从零开始学贪心算法

本文在写作过程中参考了大量资料,不能一一列举,还请见谅. 贪心算法的定义: 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关. 解题的一般步骤是: 1.建立数学模型来描述问题: 2.把求解的问题分成若干个子问题: 3.对每一子问题求解,得到子问题的局部最优解: 4.把子

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

可用贪心算法解决的几个基本问题

可用贪心算法解决的几个基本问题 分类: 算法2011-08-24 12:36 950人阅读 评论(0) 收藏 举报 算法活动作业c 关键:看问题有没有贪心选择性质和最优子结构性质.有些问题看似是可以用贪心算法,但是实际用贪心算法却得不到最优解.构造贪心算法后,需要一定的证明来确定它的正确性.常用证明方法:反证法.调整法. 几个基本问题: 1. 活动安排问题. 设有n个活动的集合e={1,2,-,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源.每个活动

JAVA算法基础-贪心算法

前言 学无止境.算法博大精深啊,一个贪心算法里面就隐含了这么多不同的场景实现,每个场景下的算法就有多种不同的实现,个人写法不一也成就了各种不同的漂亮算法,看了这些实现,也让我开拓了思维,这个世界的方案永远没有最完美的只有最合适的- ! 1.贪心算法概念 贪心算法也叫贪婪算法,当然叫法随意.主要目的是在问题求解时,做出最正确的判断= =,这不是贪心是啥?在计算机工程领域当中,就是说不考虑整体最优算法而是从局部做到最优解.当然贪心是算法不能对所有的问题都能得到整体都最优解,但对多数个问题还是能得到近

贪心算法解决会场安排问题

贪心算法解决会场安排问题. [问题描述] 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场.(这个问题实际上是著名的图着色问题.若将每一个活动作为图的一个顶点,不相容活动间用边相连.使相邻顶点有不同颜色的最小着色数,相应于要找的最小会场数.) [数据输入] 由文件input.txt给出输入数据,第一行又一个正整数K,表示有K个待安排的活动. 接下来有K行数据,每行有两个正整数,分别表示K个待安排的活动的开始时间和结束时间. [结束输出] 输出最少会场数. input.txt    

算法复习笔记(分治法、动态规划、贪心算法)

分治法 动态规划 贪心算法 分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的问题,这些子问题互相独立且与原问题相同(所以可以递归).递归地解这些子问题,然后将各个子问题的解合并得到原问题的解.它的一般算法设计模式如下: divide-and-conquer(P) { //|P|表示问题的规模,n0表示阈值,当规模不超过n0时,问题容易解出,不必分解 if(|P|<=n0) adhoc(P); //将P分解成子问题 divide P into smaller subinstanc

个人总结-----非贪心算法的图的m着色判断及优化问题

1.问题描述: 对于著名的图的m着色,有两个主要的问题,一个是图的m色判定问题,一个是图的m色优化问题,描述如下. 图的m色判定问题: 给定无向连通图G和m种颜色.用这些颜色为图G的各顶点着色.问是否存在着色方法,使得G中任2邻接点有不同颜色. 图的m色优化问题:给定无向连通图G,为图G的各顶点着色, 使图中任2邻接点着不同颜色,问最少需要几种颜色.所需的最少颜色的数目m称为该图的色数. 对于网上或书上的一些求解方式主要用贪心算法求解的方式,也有用回溯法的方式(一般不用,时空太大).如这位博主