编程之美 - 安排见面会问题
2016-02-01 20:07
281 查看
问题:有n个人会参加m个会议,其中一个人会参加m个会议中的若干个。怎样安排m个会议的日程使效率最高。
思路:书中的想法是将它转换为一个图的问题
例如:有5个人A,B,C,D,E 会参加5个会议 1,2,3,4,5,参加会议的情况如下。
A : { 1 - 2 - 3 } B : { 1 - 3 - 4 } C : { 2 - 3 } D : { 3 - 4 - 5 } E : { 1 - 4 - 5 }
A参加会议 1,2,3,隐含着1,2,3通过A已经关联在一起了
![](http://img.blog.csdn.net/20160128084219846?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这样由上面 ABCDE和12345的关系可以得到一张图
![](http://img.blog.csdn.net/20160128084249831?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
由于题目要求会议的安排不能冲突,这样它就变成了图的着色问题,图中有关联的点颜色不能一样。
代码:
测试结果:
思路:书中的想法是将它转换为一个图的问题
例如:有5个人A,B,C,D,E 会参加5个会议 1,2,3,4,5,参加会议的情况如下。
A : { 1 - 2 - 3 } B : { 1 - 3 - 4 } C : { 2 - 3 } D : { 3 - 4 - 5 } E : { 1 - 4 - 5 }
A参加会议 1,2,3,隐含着1,2,3通过A已经关联在一起了
这样由上面 ABCDE和12345的关系可以得到一张图
由于题目要求会议的安排不能冲突,这样它就变成了图的着色问题,图中有关联的点颜色不能一样。
代码:
#include <iostream> using namespace std; #define MEETING 5 #define NO_COLOR 0 #define MAX_COLOR 6 // 'N'=NONE 'R'=Red 'G'=Green 'B'=Blue 'Y'=Yellow 'W'=White 'M'=MAX char colors[MAX_COLOR+1] = {'N', 'R', 'G', 'B', 'Y', 'W', 'M'}; // A : { 1 - 2 - 3 } // B : { 1 - 3 - 4 } // C : { 2 - 3 } // D : { 3 - 4 - 5 } // E : { 1 - 4 - 5 } int meetings[MEETING][MEETING] = {{0,1,1,1,1}, {1,0,1,0,0}, {1,1,0,1,1}, {1,0,1,0,1}, {1,0,1,1,0},}; int result[MEETING] = {NO_COLOR, NO_COLOR, NO_COLOR, NO_COLOR, NO_COLOR}; bool check(int meeting, int color) { int i = 0; for (i = 0; i < MEETING; i++) { if ((meetings[i][meeting] != 0) && (color == result[i])) { return false; } } return true; } void compute() { int i = 0, j = 0; for (i = 0; i < MEETING; i++) { if (result[i] == NO_COLOR) { for (j = NO_COLOR+1; j < MAX_COLOR; j++) { if (!check(i, j)) { continue; } else { result[i] = j; break; } } } } } void print() { int i = 0; for (i = 0; i < MEETING; i++) { cout << i << ":" <<colors[result[i]] << " "; } cout << endl; } void main() { int i = 0; compute(); print(); cin >> i; }
测试结果:
相关文章推荐
- C++的ofstream与ifstream使用
- C++ 用于大型程序的工具
- python 递归和装饰器
- Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
- Java中对象调用机制
- 如何在eclipse中配置arm交叉编译环境
- Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())
- php插入转义与查找转义
- Qt属性系统
- Qt容器类(总结)
- Qt状态机框架
- Qt新建线程的方法(有QRunnable,QThreadPool,moveToThread和QtConcurrent的例子)
- 无插件固定表头代码
- 关于C语言里getchar和scanf的思考
- python 写文件刷新缓存
- 本地方法(JNI)——访问域+字符串参数
- C#成神之路<4> C#第一次程序编写
- JAVA环境变量配置
- python Popen卡死问题
- Django REST framework的各种技巧【目录索引】