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

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

解法思想:

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

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

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

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

192338509238550.png源代码

 
  
  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
192338509238550.png测试代码
 
   
  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. }









转载于:https://www.cnblogs.com/yml435/p/4660196.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值