编程之美-高效率的安排见面会

问题:有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已经关联在一起了

pic_01


这样由上面 ABCDE和12345的关系可以得到一张图

pic_02

由于题目要求会议的安排不能冲突,这样它就变成了图的着色问题,图中有关联的点颜色不能一样

算法描述:

 color[n]存储n个顶点的着色方案,可以选择的颜色为1m

t=1

对当前第t个顶点开始着色:

 若t>n  则已求得一个解,输出着色方案即可

否则,依次对顶点t着色1-m

   若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。


(将原作者的c语言改版成了java语言版)原文链接:http://blog.csdn.net/wangzhiyu1980/article/details/50598346

public class ZhuoSe
{
	private static final int MEETING =5;
	private static final int MAX_COLOR= 6;
	private static final char colors[] = {'N', 'R', 'G', 'B', 'Y', 'W'};
	private static final int meetings[][] ={ {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}, };
	private static final int result[] = {0,0,0,0,0};
	public static void main(String[] args)
	{
		compute();
		for (int i = 0; i < MEETING; i++)
		{
			int k=i+1;
			System.out.print("第"+k+"个点染色为"+colors[result[i]]+"  ");
		}	
	}
	public static boolean check(int meeting, int color)
	{
	    for (int i = 0; i < MEETING; i++)
	    {
	        if ((meetings[i][meeting] != 0) && (color == result[i]))
	        {
	            return false;
	        }
	    }
	    return true;
	}
	public static void compute()
	{
	    for (int i = 0; i < MEETING; i++)
	    {
	        if (result[i] == 0)
	        {
	            for (int j = 1; j < MAX_COLOR; j++)
	            {
	                if (!check(i, j))
	                {
	                    continue;
	                }
	                else
	                {
	                    result[i] = j;
	                    break;
	                }
	            }
	        }
	    }
	}
}
结果如下:

第1个点染色为R  第2个点染色为G  第3个点染色为B  第4个点染色为G  第5个点染色为Y  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值