區間圖着色問題(貪心算法的解法)


問題描述:假設要用很多個教室對一組活動進行調度。我們希望使用盡可能少的教室來調度所有活動。請給出一個算法,來確定哪一個活動使用哪一間教室。這個問題也被稱為區間圖着色問題,即相容的活動着同色,不相容的着不同顏色,使得所用顏色數最少。

解法思想:

    其實我們知道,對於單個教室我們可以用貪心算法進行求解,但是對於這個區間圖的問題,我們采用的方法是多次的貪心。其實你想想看,你無非就是要使那些活動

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

這明顯也是個貪心的問題。聰明的人很快地想到,是不是可以多次的貪心呢?也就是說我對這些活動作一個標記,開始全部標記為”未安排“,第一次的時候就采用貪心算

法盡可能地用一間教室安排盡可能多的活動進去,然后將安排過的活動標記為”己安排“。然后對剩下的活動再進行用同樣的貪心算法進行安排。

  
  
  
          
  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. }










免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM