大体思路是用工厂模拟算法,
1.维护2个教室链表,
一个链表busyRoom装正在被使用的,
一个链表freeRoom装空闲的;
2.维护1个时间点数组,装载所有活动的开始时间和结束时间,
数组里每个时间点有标明其是否为开始时间的bool值isBegin,
和一个指向与其属于同一活动的时间点的指针adjoint,
并用快排将其从早到晚排列;
快排的swap操作要随时能更新adjoint的值。
这个贪心算法可得到最优解,可以用归纳法证明,把笔记发上来吧。。。
接下来贴代码(⊙v⊙)
//interval_graph_coloring.cpp
#include <iostream>
using namespace std;
class Room{
public:
Room():pre(NULL),nex(NULL){
}
Room *pre;
Room *nex;
int index;
};
class RoomList{
public:
RoomList(){
nil = new Room;
nil->pre = nil;
nil->nex = nil;
}
~RoomList(){
while (nil->nex != nil){
Room *temp = nil->nex;
nil->nex = temp->nex;
delete temp;
}
delete nil;
}
bool isEmpty(){
return (nil->nex == nil);
}
void push(Room *room){
room->pre = nil->pre;
nil->pre->nex = room;
room->nex = nil;
nil->pre = room;
}
Room *pop(){
Room *top = nil->nex;
nil->nex = top->nex;
top->nex->pre = n

这篇博客介绍了如何使用贪心算法解决算法导论中的习题16.1-4,即区间图着色问题。通过维护两个教室链表(busyRoom和freeRoom)以及一个时间点数组,来追踪活动的开始和结束时间。采用快速排序对时间点进行排序,并确保能更新相邻时间点的指针。作者声称该算法能够得到最优解,并计划分享证明过程。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



