大体思路是用工厂模拟算法,
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-&